Linuxでは、文字列を含むすべてのファイルを見つけて削除するにはどうすればよいですか?


17

文字列を含むすべてのファイルを削除したいfoo。Linuxでbashを使用してこれを行うにはどうすればよいですか?


その文字列はそのファイル名ですか?
rɑːdʒɑ

3
明確にしてください:名前foo(たとえばmyfoo.jpg)が含まれるファイル、またはバイトシーケンスを含むファイルfoo(そのバイトシーケンスを含むバイナリファイルが含まれる場合があります)を削除しますか?
ハマー

回答:


33

安全な方法は次のとおりです。

grep -lrIZ foo . | xargs -0 rm -f --
  • -l 検索パターンに一致するファイルのファイル名を出力します。
  • -rfoo指定されたディレクトリでパターンの再帰検索を実行し.ます。これが機能しない場合は、を試してください-R
  • -I(capital i)は、PDFなどのバイナリファイルをスキップします。
  • -Z 空白を含む名前が間違った方法で解釈されないように(つまり、1つではなく複数の名前として)、ファイル名がゼロ(つまり、nul-)で終了するようにします。
  • xargs -0からgrepにファイル名を送り、rm -f単語をゼロ(nul)バイトで区切ります(-Zからのオプションを思い出してくださいgrep)。
  • --はしばしば忘れられますが、オプションの終わりをマークして、名前がで始まるファイルの削除を考慮するのは非常に重要-です。

どのファイルが削除されようとしているのかを確認したい場合は、単に| xargs -0 rm -f --パーツを削除し、Zオプションを省略しますgrep

別のユーザーから次のような提案がありましたが、安全ではないため実行しないでください。

files=`grep foo * | cut -d: -f1`
rm -f $files         # unsafe, do not run it!

私はファイルを持っている場合ImportantStuff、私は削除し、したくないことをobsolete ImportantStuff含むfoo、それから私を失うImportantStuff(とない obsolete ImportantStuff!)ので、私は、このコマンドを実行すると$files、それが解釈されたときにスペースを空けて壊れます。この方法でファイル名のリストをスカラーシェル変数に入れることは危険です。


17
$ find -type f -exec grep -q "foo" {} \; -exec echo rm -- {} \;

これは、を含むファイルを再帰的に検索しますfoo。2番目-execは、最初execが正常に終了した場合、つまりgrep一致した場合にのみ実行されます。ドライランしecho、出力が正しいと思われる場合は削除します。

または代わりに

$ find -type f -exec grep -q "foo" {} \; -print

そして

$ find -type f -exec grep -q "foo" {} \; -delete

Lekensteynが提案したとおり。


4
...これは次のように短縮できますfind -type f -exec grep -q 'foo' {} \; -delete(引用符{}は不要findです。ファイルを削除することもできます)。grep正規表現を受け入れることに注意してください。を検索する場合はfoo.bar、これをエスケープするか-F、パターンをリテラルとして扱うオプションを渡します。
Lekensteyn

使用する理由-exec echo rm "{}" \;はありませんか-delete
バルテック

1
@vartecいいえ、使用します-delete。2番目-execとエコーを配置することでデモンストレーションが簡単になります。
エイドリアン・フリューワート

1
を入力するよりも-print(または-lsより詳細に)入力する方が簡単です-exec echo rm "{}" \'。外部ユーティリティは必要ありません。
Lekensteyn

1
rm {}を使用する場合は、rm-{}を使用して、ファイル名自体の特殊文字が補間されないようにします。例えば、タッチ「-rf /」あなたが書き込み権限を持っている任意のディレクトリに...
ATK

1

エイドリアンが言ったことをやります

ただし、 "food"を含むファイルを誤って削除しないように、fooの周囲に単語の境界を追加します(foodを含むすべてを削除する場合を除きます)。

 $ find -type f -exec grep -q "\<foo\>" {} \; -delete

実際には、削除する前に出力をリダイレクトして、削除する前に確認できるようにしました。

 $ find -type f -exec grep -q "\<foo\>" > /tmp/list_of_files_to_delete

コメントを投稿できるようになり次第、コメントとしてそのようなものを投稿する必要があります。
FSMaxB

はい最初に試しましたが、まだコメントを投稿することが許可されていないことに気付きました。
ペッターH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.