サブディレクトリを持つディレクトリがあります。ディレクトリには、Webからクロールされた画像がたくさんあります。
どのようにしてすべてのファイルをループして、無効なイメージファイルではないファイルを表示しますか?
ファイル拡張子に基づいてはいけません。
私はこのスクリプトを思い付きました:
find . -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' | while read FILE; do
if ! identify "$FILE" &> /dev/null; then
echo "$FILE"
fi
done
_
しかし、これは貴重な画像を出力するため、機能していません。
ファイルタイプのシグネチャをチェックすることでこれを行う必要があります。これを見つけることができます こちら 、またはあなたのファイルの確認エラーでそれを見つけることができます。
たとえば、JPGシグネチャはFF D8 FF E0
です。つまり、最初の4バイトはFF D8 FF E0
に等しくなければなりません。
必要なのは、これらのバイトをファイルのものと一致させるためのツールがあります。例として、hexdump -n 4 -C file.jpg| awk '{print $2 $3 $4 $5}'
は、それらのバイトを16進形式で返します。これは、希望の署名と比較できます。
壊れた画像ファイルが壊れている可能性がある場合は、ファイルシグネチャとリカバリに関する高度な情報が見つかります ここ 。たとえば、画像のほんの一部のみがダウンロードされている場合。