UNIX のディレクトリ内の特定の文字列を含むすべてのファイルを削除するにはどうすればよいですか?

UNIX のディレクトリ内の特定の文字列を含むすべてのファイルを削除するにはどうすればよいですか?

ファイル名にスペースがない限り機能する例をいくつか見つけました。残念ながら、私のファイル名にはスペースが含まれています (これは私の選択ではなく、実際には削除する必要があるものです)。

たとえば、これがうまくいくと思った方法です:

find . -type f | grep ).MOV | xargs rm

次のようなファイルを削除したいからです:

  • L112 (1).MOV
  • L113 (1).MOV
  • L113 (2).MOV

そして、私は次のようなファイルを保存したい

  • 動画
  • 動画
  • 動画

これにより、ファイルが正しく検出されます。

検索 . -type f | grep ).MOV

しかし、rm にパイプすると、ファイル名のスペースによってエラーが発生します。

ご協力いただければ幸いです。

答え1


rm *\).MOV

答え2

改行を区切り文字として使用するように指示しますxargs

find . -type f | grep ).MOV | xargs -d'\n' rm

より良いのは、findマッチングと使用を許可し-print0xargs -0どれでもファイル名に\n!文字を含めることもできます。

find . -type f -name '*).MOV' -print0 | xargs -0 rm

さらに良いのは、直接find電話をかけることですrm

find . -type f -name '*).MOV' -exec rm {} +

最善の方法は、スキップしrmfind削除することです。

find . -type f -name '*).MOV' -delete

あるいは、この特定のケースでは、重機をすべて必要とするのは誰でしょうか?

rm *\).MOV

答え3

これを試して:

find . -name "*).MOV" -exec rm {} \;

答え4

ほとんどの Unix インストールでは、ファイル名の先頭にバックスラッシュを付けることで、ファイル名内のスペースを表すことができます。たとえば、次のように試してください。

mkdir blah
cd blah
touch file1
touch file2
touch "file 3"
touch "file 4"

「ls」を実行すると、次のようになります:

ファイル 3 ファイル 4 ファイル1 ファイル2

ここで「ls *\ *」を実行すると、スペースを含むすべての内容が表示されます。

ファイル 3 ファイル 4

おそらく、「rm *\ *」だけで十分でしょう。または、ニーズに合わせて正規表現を少し変更してください。

お役に立てれば幸いです!

関連情報