「ファイル」(生成アプリケーション名:Microsoft Word)の結果を使用して特定の文字列を取得するにはどうすればよいですか?

「ファイル」(生成アプリケーション名:Microsoft Word)の結果を使用して特定の文字列を取得するにはどうすればよいですか?

私が指定したファイルに関する情報を返す「file」の結果を使用しようとしています。

例えば

file *.doc 'all .doc extensions

次に、「生成アプリケーション名:Microsoft Word」を含むファイルに関する情報を返します。それでは、「Word」という文字列の結果を検索してみましょう。私はここに閉じ込められています。実際にどうすればいいですか?

*数時間の検索の最後に試してみた内容です。私が探している単語が何であるかわかりません。アドバイスしてください。

find . -type f -print0 | xargs -0 grep -lh "Microsoft Word" | xargs -I % mv % ../NewDirectory/

私はこれがファイル自体から「Word」という文字列を検索して新しいディレクトリに移動すると思いました。

ベストアンサー1

私が正しく理解したら、ファイルを現在のディレクトリとそのサブディレクトリから別のディレクトリに再帰的に移動したいのですが、コマンドがそのファイルをfile「Microsoft Word」ファイルとして報告する場合にのみ可能です。つまり、file "$filename" | grep 'Microsoft Word'いくつかの出力を生成するファイルに興味があります。

簡単な方法は、落ち着いて仕事を一つずつ処理することです。現在のディレクトリのファイルのみが必要な場合は、forループとワイルドカードパターンを使用できます。

for f in *.doc; do
  if …
done

条件は何ですか?出力Microsoft Wordfile "$f"。私file --はで終わる名前を避けた-

for f in *.doc; do
  if file -- "$f" | grep -s 'Microsoft Word'; then
  fi
done

私たちがしなければならないのは、ファイルを移動するコマンドを追加することだけです。

for f in *.doc; do
  if file -- "$f" | grep -s 'Microsoft Word'; then
    mv -- "$f" ../NewDirectory/
  fi
done

サブディレクトリでもファイルを見つけるには、次のようにします。**ワイルドカードパターン再帰的なワイルドカードに使用されます。 Bashで有効にするには、を使用する必要がありますshopt -s globstar(ksh93ではを実行しset -o globstar、zshではすぐに機能します。他のシェルにはこの機能はありません)。 bash 4.2以下では、ディレクトリへのシンボリックリンクに従います。

for f in **/*.doc; do
  if file -- "$f" | grep -s 'Microsoft Word'; then
    mv -- "$f" ../NewDirectory/
  fi
done

移動されたすべてのファイルは../NewDirectory/生成されたサブディレクトリなしで終了することに注意してください。ディレクトリツリーを再現するには、次のものを使用できます。文字列操作構造ファイル名のディレクトリ部分を抽出し、mkdir -p必要に応じてターゲットディレクトリを作成します。

for f in ./**/*.doc; do
  if file "$f" | grep -s 'Microsoft Word'; then
    d="${f%/*}"
    mkdir -p ../NewDirectory/"$d"
    mv "$f" ../NewDirectory/"$d"
  fi
done

fileやや脆弱な出力を解析するよりも、出力を標準化された文字列に解析する方が良いかもしれません。file -i

おすすめ記事