jpeg
ではないすべてのファイルを削除する必要がある演習があります。
私は試した find -type f |xargs file| grep -iv 'jpeg'
、しかしそれは機能しません。
現在のディレクトリまたはそのサブディレクトリにあるjpeg以外の通常のファイルをすべて削除するには、次のコマンドを使用します。
find . -type f -exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;
このアプローチは、すべてのファイル名に対して安全です。ファイル名に改行やその他の難しい文字が含まれている場合でも機能します。
find . -type f
これにより、find
コマンドが開始され、見つかったファイルが通常のファイル-type f
に制限されます。
-exec bash -c 'file -bi "$1" | grep -q image/jpeg || rm "$1"' none {} \;
見つかったすべてのファイルに対して、bashコマンドを実行してファイルのタイプをテストします。特に、ファイルのmimetypeがfile -bi "$1" | grep -q image/jpeg
であるとfile
が報告した場合、image/jpeg
はtrueを返します。演算子||
は、次のrm
コマンドがjpegテストに失敗したファイルに対してのみ実行されることを保証します。したがって、jpeg以外のファイルはすべて削除されます。
名前がnotで終わるすべてのファイルを削除するには.jpeg
で終わります:
find . -type f ! -name '*.jpeg' -delete
このアプローチは、すべてのファイル名に対しても安全です。ファイル名に改行やその他の難しい文字が含まれている場合でも機能します。
find .
現在のディレクトリとそのサブディレクトリ内のすべてのファイルを検索します
-type f
通常のファイルのみに制限する
! -name '*.jpeg'
-name '*.jpeg'
は、名前が.jpeg
で終わるすべてのファイルを検索します。ただし、感嘆符!
は否定を意味します。したがって、! -name '*.jpeg'
は、名前が.jpeg
で終わるファイルに検索を制限しますnot。
-delete
これは、上記の基準に一致するファイルを削除するようにfind
に指示します。
コマンドをテストするには、-delete
を省略します。
find . -type f ! -name '*.jpeg'
これにより、-delete
アクションが使用されたときに削除されるファイルが表示されます。