ディレクトリ内のファイルを見つけ、そのファイルのMIMEタイプで識別したいと思います。いいえファイル拡張子として。
このコマンドを使用してMIMEタイプを決定します。
% find . -type f -print0 | xargs -0 -I{} file --mime-type {}
./foo
bar.png: image/png
./OWoHp.png: image/png
./J7ZwV.png: image/png
./foo.txt: inode/x-empty
./bar: inode/x-empty
./hUXnc.png: image/png
最初のファイルのファイル名には改行文字があります。
% ls foo$'\n'bar.png
foo?bar.png
大丈夫です。ファイルは大丈夫でしょう。いいえ名前が変更されました。
次のコマンドを使用して、画像ではなくすべてのファイルをフィルタリングしたいと思います。
% find . -type f -print0 | xargs -0 -I{} file --mime-type {} | awk -F$"\0" -F": " '/image/ {print $1}'
bar.png
./OWoHp.png
./J7ZwV.png
./hUXnc.png
サイズを決定します。
% find . -type f -print0 | xargs -0 -I{} file --mime-type {} | awk -F$"\0" -F":" '/image/ {print $1}' | xargs -I{} identify -format "%[fx:w*h] %i\n" {}
identify: unable to open image `bar.png': No such file or directory @ error/blob.c/OpenBlob/2709.
identify: unable to open file `bar.png' @ error/png.c/ReadPNGImage/3922.
26696 ./OWoHp.png
47275 ./J7ZwV.png
37975 ./hUXnc.png
しかし、.という名前のファイルがないため動作しませんbar.png
。正確な名前は
./foo
bar.png
名前に改行文字があります。
ベストアンサー1
私の考えに最適なオプションは、xargsの代わりにシェルループを使用することです。これにより、コマンドがファイル名引数を送信する方法を制御できます。
find . -type f -print0 |
while IFS= read -rd "" filename; do
type=$( file --brief "$filename" )
if [[ $type == *image* ]]; then
identify -format "%[fx:w*h] %i\n" "$filename"
fi
done