回答:
find
の-delete
フラグはrmdir
、ディレクトリを削除する場合と同様に機能します。到達したときにディレクトリが空でない場合は、削除できません。
最初にディレクトリを空にする必要があります。あなたが指定されているので-type d
、find
あなたのためにそれを行うことはありません。
これを解決するには、次の2つのパスを実行します。まず__pycache__
、という名前のdirs内のすべてを削除してから、次の名前のdirsをすべて削除します__pycache__
。
find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete
多少厳密に制御されますが、1行で:
find ~ -path '*/__pycache__*' -delete
これ__pycache__
により、そのパスの一部としてあるあなたの家の中のすべてのものが削除されます。
find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -delete
として、そしてより優先されますか。
これにはいくつかの潜在的な理由があります。
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.
-delete
、「…このオプションによって深さ優先のトラバース処理が暗示されます。」とGNU find(1)が「… -deleteは-depthを意味します ...」と言うので、そうすべきではありません-depth
コマンドに追加する必要があります。
find
マンページから:「混乱を防ぐために、グローバルオプションはコマンドラインで開始点のリストの後、最初のテスト、位置オプションまたはアクションの直前に指定する必要があります。他の場所でグローバルオプションを指定する場合、findはこれは混乱を招く可能性があることを説明する警告メッセージを発行します。」さて、与えられたコマンドの-delete
後にある「グローバルオプション」~
です。また、追加しても追加しなくても違いはありませ-depth
ん。空でないディレクトリは削除されないままになります(ただし、これはおそらく私も使用しているためです-maxdepth
)
find ~ -path '*/__pycache__*' -delete
、おそらくfind ~ -path '*/__pycache__/*' -o -name __pycache__ -delete
安全である必要があります。