
私は間違った画像を見つけるためにこの小さなスクリプトを使用しています。
find -name '*.jpg' -exec identify -format "%f\n" {} \; 2>errors.txt
うまくいきますが、今少し修正する必要があります。 stderrをerror.txtにダンプするのではなく、エラーが発生したイメージのファイル名(%f)をダンプしたいと思います。つまり、エラーメッセージのリストではなく、error.txtに誤った形式のイメージファイルのリストが必要です。
-execセクションに|| echo "%f" >>Errors.txt を追加しようとしましたが、動作しませんでした。最良のアプローチは何ですか?
答え1
間違った形式の画像を見つけて、その名前を次の場所に保存しますnames.txt
。
find -name '*.jpg' -exec bash -c 'identify "$1" &>/dev/null || echo "$1">>names.txt' none {} \;
どのように動作しますか?
find -name '*.jpg'
いつものように始まります
find
。-exec bash -c 'identify "$1" &>/dev/null || echo "$1" >>names.txt' none {} \;
これは
identify
各ファイルで実行され、identify
ゼロ以外のエラーコードが返されたときにファイル名をnames.txt
。bash -c '...' none {}
bashシェルにコマンドを引用符で囲み、{}
位置引数にファイル名を割り当てます$1
。好奇心に文字
none
列が割り当てられています$0
。$0
未使用〜しない限りこの場合、bashはエラーを生成しますエラーメッセージにプログラム名で表示されます。。
議論する
|| echo "%f" >> errors.txt
-exec部分に追加しようとしましたが、動作しません。最良のアプローチは何ですか?
||
微妙な点は、命令に従って行動しなければならないということですidentify
。これを行うには、上記の方法をidentify
使用してシェルに入れる必要があります。bash -c
答え2
find . -name '*.jpg' -exec sh -c '
for file do
if identify "$file"; then
printf "%s\n" "$file" >&3
else
printf "%s\n" "$file" >&4
fi
done' sh {} + 3> good 4> bad > /dev/null 2>&1
答え3
だからあなたは次のようなものが欲しい...
find . -name '*.jpg' \
! -exec identify -silent {} \; \
-print 2>/dev/null >errors.txt