如何在查找目录时使用 find 和 -delete

如何在查找目录时使用 find 和 -delete

我知道我能做到

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'可能不匹配任何内容。在这种情况下,该命令将删除比您预期更多的内容。

  • -deletePOSIX 不要求。便携式解决方案需要-exec rm …xargs。我不知道您所说的“更容易出错”是什么意思。您的-exec rm -rf '{}'似乎几乎没问题。添加后,--对我来说似乎完全没问题:

    find . -name '*.pyc' -prune -exec rm -rf -- {} +
    

    我曾经-prune避免过这种情况:根据名称删除文件和目录。没有这样的文件或目录

相关内容