注文する
$ 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
最初に処理してからその内容を処理します。
ただし、その内容の後にディレクトリを処理するように指示してこの問題を解決するオプションがあります-depth
。find
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.