web-dev-qa-db-ja.com

jpeg以外のファイルをすべて削除する

jpegではないすべてのファイルを削除する必要がある演習があります。

私は試した find -type f |xargs file| grep -iv 'jpeg'、しかしそれは機能しません。

2
diego9403

ファイルのMIMEタイプに基づいて削除する

現在のディレクトリまたはそのサブディレクトリにある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アクションが使用されたときに削除されるファイルが表示されます。

7
John1024