質問: linuxでは、文字列を含むすべてのファイルを検索して削除するにはどうすればよいですか? 文字列fooを含むすべてのファイルを削除します。 linuxでbashを使用してこれを行うにはどうすればよいですか?
回答: 安全な方法は次のとおりです。grep -lriz foo . | xargs -0 rm -f -- -lは、検索パターンに一致するファイルのファイル名を出力します。 -rは、指定されたディレクトリ.でパターンfooを再帰的に検索します。これが機能しない場合は、-rをお試しください。 -i(大文字のi)を使用すると、pdfなどのバイナリファイルがスキップされます。 -zは、空白を含む名前が誤った方法で解釈されないように(つまり、1つではなく複数の名前として)、ファイル名がゼロ(つまり、nul-)で終了することを保証します。 xargs -0は、ファイル名をgrepからrm -fまでフィードし、単語をゼロ(nul)バイトで区切ります(grepの-zオプションを思い出してください)。 --はしばしば忘れられますが、オプションの終わりをマークし、名前が-で始まるファイルの削除を許可することは非常に重要です。 削除されるファイルを確認する場合は、| xargs -0 rm -f --の部分を削除し、zオプションをgrepにしないでください。別のユーザーが次のようなものを提案しました。これは安全でないため、(実行しないでください)です。files=`grep foo * | cut -d: -f1` rm -f $files # unsafe, do not run it! 削除したくないファイルimportantstuffとfooを含むobsolete importantstuffがある場合、importantstuffを失います(そしてnot obsolete importantstuff!)このコマンドを実行すると、解釈されたときに$filesがスペースで分解されるためです。このようにファイル名のリストをスカラーシェル変数に入れるのは危険です。