find -delete は空でないディレクトリを削除しません。

find -delete は空でないディレクトリを削除しません。

注文する

$ find ~ -name .DS_Store -ls -delete

Mac OS Xで動作しますが、

$ find ~ -name __pycache__ -type d -ls -delete

いいえ - ディレクトリが見つかりましたが削除されませんでした。

なぜ?

PS。私もできることを知っています

$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +

問題はなぜ find -deleteするいいえ働く

答え1

findフラグは-delete次のように動作します。rmdirディレクトリを削除するとき。ディレクトリに到達したときに空でない場合、ディレクトリは削除できません。

まず、このディレクトリを消去する必要があります。-type dを指定しているため、findこれは行われません。

2回実行してこの問題を解決できます。まず、名前付きディレクトリ内のすべてのエントリを削除してから、名前付き__pycache__すべてのディレクトリを削除します__pycache__

find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete

それほど厳しくないコントロールですが、1行で書かれています。

find ~ -path '*/__pycache__*' -delete

これにより、自宅からそのルートの一部である__pycache__すべてのアイテムが削除されます。

答え2

これにはいくつかの潜在的な理由があります。

1) ディレクトリ()のみを削除するように指示し、-type dそのディレクトリにはまだファイルが含まれています。

2) あなたのディレクトリには他のディレクトリだけが含まれているため、-type dコンテンツの問題は解決されます。ただし、FreeBSDに基づくOS-Xを使用しており、FreeBSDはデフォルトでディレクトリをfind最初に処理してからその内容を処理します。
ただし、その内容の後にディレクトリを処理するように指示してこの問題を解決するオプションがあります-depthfind

find ~ -name __pycache__ -type d -ls -delete -depth

-deleteこのオプションは暗黙的に有効になっているため、Linuxではこの問題は発生しません-depth

 

無料BSD man 1 find:

 -depth  Always true; same as the non-portable -d option. Cause find to
   perform a depth-first traversal, i.e., directories are visited in
   post-order and all entries in a directory will be acted on before
   the directory itself. By default, find visits directories in
   pre-order, i.e., before their contents. Note, the default is not
   a breadth-first traversal.

グヌman 1 find

 -depth Process each directory's contents before the directory itself. The -delete
        action also implies -depth.

関連情報