如何根据“find”输出删除目录?

如何根据“find”输出删除目录?

我发出以下命令来查找 .svn 目录:

find . -name ".svn"

这给了我以下结果:

./toto/.svn
./toto/titi/.svn
./toto/tata/.svn

我如何处理所有这些行以rm -fr删除目录及其内容?

答案1

Find 可以使用-exec它找到的每个匹配项的选项来执行参数。这是推荐的机制,因为您可以正确处理包含空格/换行符和其他字符的路径。您必须先删除目录的内容,然后才能删除目录本身,因此请使用-r命令rm来实现此目的。

对于您的示例,您可以发出:

find . -name ".svn" -exec rm -r "{}" \;

您还可以告诉 find 只查找目录通过添加-type d检查命名为 .svn:

find . -name ".svn" -type d -exec rm -r "{}" \;

警告rm -r请谨慎使用,它会删除该文件夹及其所有内容。

如果您只想删除空目录以及仅包含空目录的目录, find 可以使用-deleteand自行完成-empty

find . -name ".svn" -type d -empty -delete

答案2

这是一种比公认的答案更快的便携式方法。

使用 a+代替分号作为find命令终止符可以优化 CPU 使用率。如果您有很多.svn子目录,这可能很重要:

find . -name .svn -type d -exec rm -rf {} +

另请注意,您永远不需要在此处引用花括号。

1除非您使用fishshell(自从我写此回复以来,这可能已被修复)。

答案3

假设您正在使用gnu 查找,您可以使用以下-delete选项:

find . -name test -delete

这更容易记住。

答案4

在我的电脑上,当我使用:

find . \( -name dirname -type d \) -exec rm -r '{}' ';'

目录已删除,但出现错误:

find: ‘./dirname’: No such file or directory

对于每个目录。

我的目录不为空,因此 -delete 选项对我不起作用。我找到了这种行为的原因这里:

  1. find 获取(不一定)./ 目录中的第一个条目。例如 dir.1/
  2. 它将它与模式“dir.?”进行比较。匹配吗?是的。
  3. find 执行“rm -r dir.1”。
  4. find 尝试输入 dir.1/ 以在目录中查找模式。它不知道有关 exec 命令的任何信息。
  5. 它不再找到 dir.1/ 了。返回 ENOENT (查看 strace 输出)

我用这个来解决:

rm -r `find . -name dirname -type d`

请记住,find 仍会尝试递归到名为 dirname 的目录,这并不是真正必要的,并且会花费一些额外的时间。根据您的目录结构,您也许可以使用--depthfind 选项解决此问题。此外,如果您有类似 dirname/foo/dirname 的目录结构,您将从 rm 收到“没有这样的文件或目录”错误。要抑制错误,您可以将 stderr 重定向到 /dev/null 或使用-frm 的 (force) 标志。

相关内容