ワイルドカードでディレクトリを再帰的に削除するにはどうすればよいですか?


51

WD My Book World EditionでSSHを使用しています。基本的に、特定のディレクトリレベルから開始し、一致するすべてのサブディレクトリを再帰的に削除します.Apple*。それについてどうすればいいですか?

私は試した

rm -rf .Apple* そして rm -fR .Apple*

サブディレクトリ内のその名前に一致する削除されたディレクトリもありません。

回答:


73

find ツリー全体でアクションを選択的に実行するのに非常に便利です。

find . -type f -name ".Apple*" -delete

ここでは-type f、ディレクトリではなくファイルであることを確認します。また、シンボリックリンク、ソケットなどをスキップするため、正確に望んでいるとは限りません。を使用できます! -type d。これは、文字通りディレクトリではないことを意味しますが、文字を削除してデバイスをブロックすることもできます。-typeのmanページで述語を見ることをお勧めしますfind

厳密にワイルドカードを使用してこれを行うには、高度なシェルサポートが必要です。Bash v4にはglobstarオプションがあり、これを使用してサブディレクトリを再帰的に一致させることができます**zshまた、kshこのパターンをサポートします。それを使用すると、できますrm -rf **/.Apple*。これはPOSIX標準ではなく、移植性もあまり高くないため、スクリプトで使用することは避けますが、1回限りの対話型シェルアクションの場合は問題ありません。


3
私はfind . -type d -name .Apple*仕事に取り掛かることができます-すべてのフォルダーをリストします。ただし、-delete最後に追加すると失敗します。使用方法の概要が表示されます。BusyBox v1.1.1で実行されています。それは違いがありますか?
コードドッグ

1
-deletePOSIXでもありません。90年代初期**に導入されzshました。現在は(出現順で)ksh93、fish、bash、tcshでもあります。
ステファンシャゼル14

1
+1rm -rf **/.Apple*
アンドリーボイコ

1
@codedog、動作-deleteしない場合は-exec rm -f {} +代わりに使用します。
ワイルドカード

1
あなたが得ることができfind、それが削除されますように冗長であることを?「globstar」メソッドは-vスイッチを追加することでこれを行うと思います。
デミス

16

そのmanページで述べられているように、意図的な振る舞い(つまり、パスが./で始まる場合は削除を拒否しますが、私の場合はそうします)により、findwithの使用に問題が発生しました。-deletefind

 -delete

見つかったファイルやディレクトリを削除します。常にtrueを返します。これは、ツリーを再帰的に検索するときに現在の作業ディレクトリから実行されます。「。」を基準としたパス名に「/」文字が含まれるファイル名は削除されません。セキュリティ上の理由から。
このオプションにより、深さ優先のトラバーサル処理が暗示されます。
次のシンボリックリンクはこのオプションと互換性がありません。

代わりに、私はちょうどできました

find . -type d -name 'received_*_output' -exec rm -r {} +

あなたの場合、グロブ(アスタリスク、*)を引用することが解決策のようですが、他の誰かが同様の問題を抱えている場合に備えて、答えを提供したかったのです。

注:以前、私の答えは次のようにすることでしたが、@ Wildcardはコメントでそれを行う際のセキュリティ上の欠陥を指摘しました。

find . -type d -name 'received_*_output' | xargs rm -r

1
xargsここで使用する正当な理由はありません。 -exec rm -r {} \;または、より良い-exec rm -r {} +ことに、特殊文字のファイル名で失敗することなく同様に行います。参照してくださいなぜ検索の出力悪い練習をループされますか?
ワイルドカード

知っておくといいです。IMOは、コマンドでジョブを実行できるため、下票する価値はありませんが、パフォーマンスの最適化は高く評価されています。
パット

1
それがパフォーマンスの最適化にすぎない場合、私はあなたに同意しますが、そうではありません。これはセキュリティホールです。名前に空白文字が含まれるファイルを正しく処理していないため、悪意を持って作成されたファイル名はデータの損失につながります。また、bash / POSIXシェルで変数を引用符で囲むのを忘れた場合のセキュリティへの影響も参照してください。その一部は適用可能であり、少なくとも、私が話している問題のタイプについてのいくらかの考えを与えるかもしれません。
ワイルドカード

mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'データ損失の可能性があると思わない場合は、ディレクトリで試してから同じコマンドを再度実行してください。または、質問以来、マックOSについてですmkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'。(警告:これを行うと、すべてのファイルが削除されます。それは私のポイントです。)
ワイルドカード

0

可能性は、rm / findコマンドには何も問題はないが、ログインしているユーザーには実際には削除権限がないということです。を使用ls -lして、アクセス許可を使用して物事を一覧表示します。また、idand groupsコマンド(どちらも使用可能)で自分が誰であるかを識別できます。あなたがこれを行う「間違ったユーザー」である場合、ファイルの許可/所有権を変更するか、別のユーザーに切り替える必要があります。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.