入力データのawkと改行

入力データのawkと改行

ディレクトリ内のファイルを見つけ、そのファイルの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

おすすめ記事