web-dev-qa-db-ja.com

ディレクトリ自体を保持したまま、名前でディレクトリを再帰的に検索し、その内容(すべてのサブディレクトリとファイルを含む)を削除するにはどうすればよいですか?

指定

  1. フォルダーEmptyMeが異なるレベルにあるツリー構造を持っています
  2. EmptyMeディレクトリにはサブディレクトリとファイルが含まれます

必須

  1. EmptyMeディレクトリの空の内容(inlcudingのサブディレクトリ)、これらのディレクトリは保持します(削除しません)。

質問

現在のレベルからすべてのEmptyMeディレクトリを再帰的に検索し、ディスク上のEmptyMeディレクトリを保持したまま、そのすべてのコンテンツ(サブディレクトリを含む)を削除するUnixコマンドとは何ですか?

私の試み

$ find . -name 'EmptyMe' -type d -exec rm -- {} +
rm: cannot remove `./a/b/c/d/EmptyMe': Is a directory

ご覧のように、そのコマンドはその内容ではなく、EmptyMeを削除しようとしました。

ありがとう!

6
temuri

テスト走行:

find . -path '*/EmptyMe/*'

実際の削除:

find . -path '*/EmptyMe/*' -delete

-path '*/EmptyMe/*'は、EmptyMeというディレクトリにあるすべてのアイテムに一致を意味します。

9
wjandrea

使用できる1つのオプションは、コマンドをネストすることです。

find . -type d -name 'EmptyMe'  -exec find {} -mindepth 1 -delete \;

外側のfind -type d -name 'EmptyMe'は必要なディレクトリを見つけ、-exec ... \;を介して内側のfindコマンドを実行します。内部コマンドは、見つかったディレクトリ({}を介して参照)に降ります。ここでは-deleteフラグを使用しているため、深さ優先検索を実行し、ファイルを削除してからサブディレクトリを削除します。

3

これは機能しますが、EmptyMeディレクトリが空の場合はエラーになります。

find . -name 'EmptyMe' -type d -exec sh -c 'rm -r -- "$1"/*' sh {} \;

エラーの例:

rm: cannot remove ‘./EmptyMe/*’: No such file or directory
0
wjandrea