ワイルドカードを使用してディレクトリを再帰的に削除する方法は?

ワイルドカードを使用してディレクトリを再帰的に削除する方法は?

私はWD My Book World EditionでSSHを通じて作業しています。デフォルトでは、特定のディレクトリレベルで始まり、一致するすべてのサブディレクトリを再帰的に削除したいと思います.Apple*。どうすればいいですか?

頑張った

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

その名前と一致するサブディレクトリは削除されません。

答え1

findツリー全体でオプションでタスクを実行するのに非常に便利です。

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

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

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

答え2

マニュアルページに記載されている意図的な動作のため(パスが./で始まる場合は削除を拒否し、私の場合はこれを行います)、次のfind使用に問題があります。-deletefind

 -delete

見つかったファイルおよび/またはディレクトリを削除します。常に true を返します。ツリーで find が繰り返されると、現在の作業ディレクトリで実行されます。パス名に「.」に基づいて「/」文字を含むファイル名は削除されません。セキュリティ上の理由から。
このオプションは、深さ優先巡回処理を意味します。
次のシンボリックリンクはこのオプションと互換性がありません。

代わりに私はできました

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

あなたの場合、glob(asterisk、*)を引用することは解決策のようですが、同様の問題を抱えている他の人がいる場合に備えて答えを提供したいと思いました。

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

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

答え3

努力する:

shopt -s dotglob           # using Bash
printf '%s\n' ./.Apple*    # test
#rm -rf ./.Apple*    

答え4

簡単なコマンド:

rm `find ./ -name '.Apple*'` -rf

頑張ってください!

関連情報