回答:
find
ツリー全体でアクションを選択的に実行するのに非常に便利です。
find . -type f -name ".Apple*" -delete
ここでは-type f
、ディレクトリではなくファイルであることを確認します。また、シンボリックリンク、ソケットなどをスキップするため、正確に望んでいるとは限りません。を使用できます! -type d
。これは、文字通りディレクトリではないことを意味しますが、文字を削除してデバイスをブロックすることもできます。-type
のmanページで述語を見ることをお勧めしますfind
。
厳密にワイルドカードを使用してこれを行うには、高度なシェルサポートが必要です。Bash v4にはglobstar
オプションがあり、これを使用してサブディレクトリを再帰的に一致させることができます**
。zsh
また、ksh
このパターンをサポートします。それを使用すると、できますrm -rf **/.Apple*
。これはPOSIX標準ではなく、移植性もあまり高くないため、スクリプトで使用することは避けますが、1回限りの対話型シェルアクションの場合は問題ありません。
-delete
POSIXでもありません。90年代初期**
に導入されzsh
ました。現在は(出現順で)ksh93、fish、bash、tcshでもあります。
rm -rf **/.Apple*
-delete
しない場合は-exec rm -f {} +
代わりに使用します。
find
、それが削除されますように冗長であることを?「globstar」メソッドは-v
スイッチを追加することでこれを行うと思います。
そのmanページで述べられているように、意図的な振る舞い(つまり、パスが./で始まる場合は削除を拒否しますが、私の場合はそうします)により、find
withの使用に問題が発生しました。-delete
find
-delete
見つかったファイルやディレクトリを削除します。常にtrueを返します。これは、ツリーを再帰的に検索するときに現在の作業ディレクトリから実行されます。「。」を基準としたパス名に「/」文字が含まれるファイル名は削除されません。セキュリティ上の理由から。
このオプションにより、深さ優先のトラバーサル処理が暗示されます。
次のシンボリックリンクはこのオプションと互換性がありません。
代わりに、私はちょうどできました
find . -type d -name 'received_*_output' -exec rm -r {} +
あなたの場合、グロブ(アスタリスク、*)を引用することが解決策のようですが、他の誰かが同様の問題を抱えている場合に備えて、答えを提供したかったのです。
注:以前、私の答えは次のようにすることでしたが、@ Wildcardはコメントでそれを行う際のセキュリティ上の欠陥を指摘しました。
find . -type d -name 'received_*_output' | xargs rm -r
xargs
ここで使用する正当な理由はありません。 -exec rm -r {} \;
または、より良い-exec rm -r {} +
ことに、特殊文字のファイル名で失敗することなく同様に行います。参照してくださいなぜ検索の出力悪い練習をループされますか?
mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
データ損失の可能性があると思わない場合は、ディレクトリで試してから同じコマンドを再度実行してください。または、質問以来、マックOSについてですmkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
。(警告:これを行うと、すべてのファイルが削除されます。それは私のポイントです。)
試してください:
shopt -s dotglob # using Bash
printf '%s\n' ./.Apple* # test
#rm -rf ./.Apple*
find . -type d -name .Apple*
仕事に取り掛かることができます-すべてのフォルダーをリストします。ただし、-delete
最後に追加すると失敗します。使用方法の概要が表示されます。BusyBox v1.1.1で実行されています。それは違いがありますか?