特定のWordを含む名前を持つすべてのファイルを削除したい"車"。これまでのところ、私はこれを思いついた:
find|grep car
出力をrmに渡すにはどうすればよいですか?
find . -name '*car*' -exec rm -f {} \;
または、パイプラインの出力をxargs
に渡します。
find | grep car | xargs rm -f
これらは非常に鈍いツールであり、削除するつもりのないファイルを削除する可能性が高いことに注意してください。また、ここでは、空白(改行を含む)や先頭のダッシュなどの文字を含むファイルを処理する努力は行われません。注意してください。
rm -fr
は危険なコマンドなどなので、最初に削除するものを表示するには:
find /path/to/file/ | grep car | xargs ls -lh
次に、結果が希望どおりである場合、ls -lh
を削除して実際のコマンドを実行し、rm -fr
に置き換えます
find /path/to/file/ | grep car | xargs rm -fr
私は使うのが好きです
rm -rf $(find . | grep car)
rm -rf
がすべてのファイルとフォルダーのリストであるgrep car
の出力から返されるものに対して論理的にfind .
を実行して、要求どおりに実行します。
本当にfind
を-print0
と使用し、rm
を--
と使用したい場合:
find [dir] [options] -print0 | grep --null-data [pattern] | xargs -0 rm --
具体的な例(ファイル名にcarを含む現在のディレクトリ以下のすべてのファイルを削除する):
find . -print0 | grep --null-data car | xargs -0 rm --
なぜこれが必要なのか:
-print0
、--null-data
および-0
は、入力/出力の処理を、空白で区切られたトークンとして解析されたものから、\0
文字で区切られたトークンとして解析されたものに変更します。これにより、異常なファイル名の処理が可能になります(詳細についてはman find
を参照)rm --
は、rm
へのパラメーターとして扱うのではなく、-
で始まるファイルを実際に削除するようにします。 -rf
というファイルがあり、find . -print0 | grep --null-data r | xargs -0 rm
というファイルがある場合、ファイル-rf
は削除されない可能性がありますが、他のファイルのrmの動作は変更されます。これにより、一致するパターン(* .xml)を持つファイルが検索され、一致する文字列(exclude = "1")の内容が検索され、一致するファイルが削除されます。
find . -type f -name "*.xml" -exec grep exclude=\"1\" {} \; -exec rm {} \;
いつ find | grep car | xargs rm -f
結果を取得:
/path/to/car
/path/to/car copy
空白を含む一部のファイルは削除されません。
だから私の答えは:
find | grep car | while read -r line ; do
rm -rf "${line}"
done
そのため、空白を含むファイルは削除できます。
ちょっとしたネクロマンシーですが、find、grep、xargsも使用できます
find . -type f | grep -e "pattern1" -e "pattern2" | xargs rm -rf
^ Findは、ファイル、mindepth、maxdepth、グロブなど、ニーズに合わせて機能させるために注意が必要です。
Lsとgrepを使用してファイルを検索し、rm -rfを使用してファイルを削除できます。
rm -rf $(ls | grep car)
ただし、ディレクトリやファイルが削除される可能性があり、grepで指定した文字パターンの名前が付いている場合は、このコマンドを使用することはお勧めできません。
find start_dir -iname \*car\* -exec rm -v {} \;