回答:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
動作します。よりエレガントな方法があるかもしれません。
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;
それ以外の場合、execは最後の部分にのみ適用されます(-iname '*.jpg'
この場合)。
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0
JPGファイルのみを印刷します!あなたはここに括弧が必要:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
-E
あなたの正規表現で括弧とパイプをエスケープする必要がなくなります。
-E
オプションはfind
「拡張正規表現」を使用するように指示します。他のいくつかのツールにも同様のオプションがありますが、このオプションがすべてのUNIXディストリビューションで使用できるかどうかはわかりません。
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
。
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
。-iregex
フラグを使用すると、find
大文字と小文字を区別せずに一致します。
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
これは、file
コマンドを使用して、ファイル名(または拡張子)に関係なく、ファイルのタイプを認識しようとします。
/path/to
またはファイル名に文字列が含まれている場合image
、上記は偽のヒットを返す可能性があります。その場合、私はお勧めします
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
、-o -name *.jpeg
、-o -iname *gif
すべてのわずかに異なるフォーマットを持っています。
ファイルに拡張子がない場合、ファイルのMIMEタイプを検索できます
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
ここで(audio | video | matroska | mpeg)はMIMEタイプの正規表現です
&それらを削除する場合:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
または、それらの拡張子以外のすべてを削除します。
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
〜ではなく!〜に注意してください