Answers:
find
的-delete
标志的作用类似于rmdir
删除目录时的标志。如果目录在到达时不为空,则无法删除。
您需要先清空目录。由于您指定-type d
,find
因此不会为您完成此操作。
您可以通过两次传递来解决此问题:首先删除名为dirs的所有内容__pycache__
,然后删除名为dirs的所有dirs __pycache__
:
find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete
不太严格的控制,但在一行中:
find ~ -path '*/__pycache__*' -delete
这将删除您家庭中__pycache__
作为路径一部分的任何东西。
find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -delete
as ,并且优先于或。
有两个可能的原因。
1)
您告诉它仅删除目录(-type d
),并且这些目录中仍包含文件。
2)
您的目录仅包含其他目录,因此-type d
将会解决内容问题。但是,您使用的OS-X主要基于FreeBSD,find
默认情况下,FreeBSD 会先处理目录。
但是,-depth
存在通过告诉find
目录内容处理后解决该问题的选项。
find ~ -name __pycache__ -type d -ls -delete -depth
在Linux上不存在此问题,因为该-delete
选项隐式启用-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
页中:“为避免混淆,应在命令行中在起始点列表之后,第一个测试,位置选项或操作之前指定全局选项。如果在其他位置指定了全局选项,请查找发出警告消息,说明可能造成混淆。” 现在,在给定命令-delete
之后是“全局选项” ~
。我还注意到,无论是否添加,都没有区别-depth
。非空目录保持不变(但这可能是因为我也使用-maxdepth
过)
find ~ -path '*/__pycache__*' -delete
,或者可能find ~ -path '*/__pycache__/*' -o -name __pycache__ -delete
是安全的。