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


32

コマンド

$ 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機能しないのです。

回答:


36

find-deleteフラグはrmdir、ディレクトリを削除する場合と同様に機能します。到達したときにディレクトリが空でない場合は、削除できません。

最初にディレクトリを空にする必要があります。あなたが指定されているので-type dfindあなたのためにそれを行うことはありません。

これを解決するには、次の2つのパスを実行します。まず__pycache__、という名前のdirs内のすべてを削除してから、次の名前のdirsをすべて削除します__pycache__

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

多少厳密に制御されますが、1行で:

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

これ__pycache__により、そのパスの一部としてあるあなたの家の中のすべてのものが削除されます。


4.4.2の検索では、最後のコマンドはである必要がありfind ~ -path '*/__pycache__*' -delete、おそらくfind ~ -path '*/__pycache__/*' -o -name __pycache__ -delete安全である必要があります。
naught101

3
@ naught101、あるべきものfind ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -deleteとして、そしてより優先されます
ステファンシャゼラス

6

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

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

2) ディレクトリには他のディレクトリのみが含まれているため-type d、コンテンツの問題に対処します。ただし、主にFreeBSDに基づいているOS-Xを使用しており、findデフォルトでは、FreeBSDはその内容の前にディレクトリを処理します。
ただし、コンテンツの後にディレクトリを処理-depthするように指示findすることにより、この問題を解決するオプションが存在します。

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

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

 

FreeBSD 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.

GNU man 1 find

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

2
ええ、しかし、FreeBSDのfind(1)-delete、「…このオプションによって深さ優先のトラバース処理が暗示されます。」とGNU find(1)が「… -deleteは-depthを意味します ...」と言うので、そうすべきではありません-depthコマンドに追加する必要があります。
G-Manが「Reinstate Monica」と言う14

1
GNUのfindマンページから:「混乱を防ぐために、グローバルオプションはコマンドラインで開始点のリストの後、最初のテスト、位置オプションまたはアクションの直前に指定する必要があります。他の場所でグローバルオプションを指定する場合、findはこれは混乱を招く可能性があることを説明する警告メッセージを発行します。」さて、与えられたコマンドの-delete後にある「グローバルオプション」~です。また、追加しても追加しなくても違いはありませ-depthん。空でないディレクトリは削除されないままになります(ただし、これはおそらく私も使用しているためです-maxdepth
デビッドトンホーファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.