命令
$ find ~ -name .DS_Store -ls -delete
可以在 Mac OS X 上运行,但是
$ find ~ -name __pycache__ -type d -ls -delete
不 - 目录已找到但未删除。
为什么?
附言。我知道我能做到
$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +
问题是为什么 find -delete
做不是工作。
答案1
find
的-delete
标志的作用类似于rmdir
删除目录时。如果到达时该目录不为空,则无法删除该目录。
您需要先清空该目录。由于您正在指定-type d
,find
因此不会为您执行此操作。
您可以通过执行两遍来解决此问题:首先删除名为 的目录中的所有内容__pycache__
,然后删除所有名为 的目录__pycache__
:
find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete
控制不太严格,但在一行中:
find ~ -path '*/__pycache__*' -delete
这将删除您家中包含__pycache__
其路径一部分的所有内容。
答案2
这有几个潜在的原因。
1)
您告诉它仅删除目录 ( -type d
),并且这些目录中仍然包含文件。
2)
您的目录仅包含其他目录,因此将-type d
解决内容问题。然而,您使用的是 OS-X,它主要基于 FreeBSD,并且 FreeBSDfind
默认情况下会先处理目录,然后再处理其内容。
但是,可以选择通过告诉在其内容之后处理目录来-depth
解决此问题。find
find ~ -name __pycache__ -type d -ls -delete -depth
Linux 上不存在此问题,因为该-delete
选项隐式启用-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.
GNU man 1 find
:
-depth Process each directory's contents before the directory itself. The -delete action also implies -depth.