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工作。

Answers:


36

find-delete标志的作用类似于rmdir删除目录时的标志。如果目录在到达时不为空,则无法删除。

您需要先清空目录。由于您指定-type dfind因此不会为您完成此操作。

您可以通过两次传递来解决此问题:首先删除名为dirs的所有内容__pycache__,然后删除名为dirs的所有dirs __pycache__

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

不太严格的控制,但在一行中:

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

这将删除您家庭中__pycache__作为路径一部分的任何东西。


在发现4.4.2中,最后一个命令必须为find ~ -path '*/__pycache__*' -delete,或者可能find ~ -path '*/__pycache__/*' -o -name __pycache__ -delete是安全的。
naught101 '16

3
@ naught101,应为find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -deleteas 并且优先于
斯特凡Chazelas

6

有两个可能的原因。

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.

2
是的,但是FreeBSD的find(1)表示:-delete“ ...此选项隐含了深度优先遍历处理。”,GNU find(1)说:“ ... -delete意味着-depth,...”,因此不应必须添加-depth到命令中。
G-Man说'Resstate Monica''14

1
在GNU手册find页中:“为避免混淆,应在命令行中在起始点列表之后,第一个测试,位置选项或操作之前指定全局选项。如果在其他位置指定了全局选项,请查找发出警告消息,说明可能造成混淆。” 现在,在给定命令-delete之后是“全局选项” ~。我还注意到,无论是否添加,都没有区别-depth。非空目录保持不变(但这可能是因为我也使用-maxdepth过)
David Tonhofer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.