find -delete 不删除非空目录

find -delete 不删除非空目录

命令

$ 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 dfind因此不会为您执行此操作。

您可以通过执行两遍来解决此问题:首先删除名为 的目录中的所有内容__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.

相关内容