我知道我能做到
find . -name '*.pyc' -delete
但是当我寻找特定目录时,-delete
却无法报告目录不为空。
是否可以强制 find 删除非空目录?我不想使用,-exec rm -rf '{}'
因为对我来说这似乎更容易出错。
答案1
find . \( -name '*.pyc' -o -path '*.pyc/*' \) -delete
如果目录匹配,-name '*.pyc'
则其中的所有内容都匹配-path '*.pyc/*'
。反之亦然:如果某个目录匹配,则其上方某处-path '*.pyc/*'
有一个目录匹配。我们使用逻辑或 ( ) 来删除任一类型的对象。-name '*.pyc'
-o
笔记:
- 由于以下原因,您需要括号:为什么在 Linux 中使用
find
时会跳过预期结果?-o
-delete
暗示-depth
,因此对象按正确的顺序被删除。警告:
find . …
应该可以正常工作,但find path …
可能不行。考虑find /mnt/a.pyc/foo/ \( -name '*.pyc' -o -path '*.pyc/*' \) -delete
将会
-path '*.pyc/*'
匹配一切while-name '*.pyc'
可能不匹配任何内容。在这种情况下,该命令将删除比您预期更多的内容。-delete
POSIX 不要求。便携式解决方案需要-exec rm …
或xargs
。我不知道您所说的“更容易出错”是什么意思。您的-exec rm -rf '{}'
似乎几乎没问题。添加后,--
对我来说似乎完全没问题:find . -name '*.pyc' -prune -exec rm -rf -- {} +
我曾经
-prune
避免过这种情况:根据名称删除文件和目录。没有这样的文件或目录。