私が指定したファイルに関する情報を返す「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 Word
にfile "$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