我发出以下命令来查找 .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 可以使用-delete
and自行完成-empty
:
find . -name ".svn" -type d -empty -delete
答案2
这是一种比公认的答案更快的便携式方法。
使用 a+
代替分号作为find
命令终止符可以优化 CPU 使用率。如果您有很多.svn
子目录,这可能很重要:
find . -name .svn -type d -exec rm -rf {} +
另请注意,您永远不需要在此处引用花括号。
1除非您使用fish
shell(自从我写此回复以来,这可能已被修复)。
答案3
答案4
在我的电脑上,当我使用:
find . \( -name dirname -type d \) -exec rm -r '{}' ';'
目录已删除,但出现错误:
find: ‘./dirname’: No such file or directory
对于每个目录。
我的目录不为空,因此 -delete 选项对我不起作用。我找到了这种行为的原因这里:
- find 获取(不一定)./ 目录中的第一个条目。例如 dir.1/
- 它将它与模式“dir.?”进行比较。匹配吗?是的。
- find 执行“rm -r dir.1”。
- find 尝试输入 dir.1/ 以在目录中查找模式。它不知道有关 exec 命令的任何信息。
- 它不再找到 dir.1/ 了。返回 ENOENT (查看 strace 输出)
我用这个来解决:
rm -r `find . -name dirname -type d`
请记住,find 仍会尝试递归到名为 dirname 的目录,这并不是真正必要的,并且会花费一些额外的时间。根据您的目录结构,您也许可以使用--depth
find 选项解决此问题。此外,如果您有类似 dirname/foo/dirname 的目录结构,您将从 rm 收到“没有这样的文件或目录”错误。要抑制错误,您可以将 stderr 重定向到 /dev/null 或使用-f
rm 的 (force) 标志。