我对bash中的命令查询有疑问。我正在尝试删除所有名为Cache的目录。
这会找到所有名为“Cache”的目录/文件
find . -name "Cache" -print
但这并没有删除它们,我发现了一堆错误,说“没有这样的文件或目录”。
find . -name "Cache" -exec rm -rf {} \;
但这有效
find . -name Cache -exec rm -rf {} \;
没有空格或任何非字母数字字符。谁能帮我理解发生了什么?谢谢。
答案 0 :(得分:5)
这与引号无关。你得到“没有这样的文件或目录”的原因是因为该目录正在被删除,但由于你忘了使用-prune
,他们也进入了。当然,由于它们不再存在,您现在收到错误消息。
find . -name "Cache" -exec rm -rf {} \; -prune
答案 1 :(得分:1)
-depth
的{{1}}选项有时用于摆脱像这样的操作中的“找不到文件”错误...它强制在目录本身之前处理目录内容。
我没有看到引号如何在你的例子中产生影响。他们是 两个都运行相同的目录配置,或者你尝试过一个(产生错误,还修改目录结构),然后尝试另一个?
答案 2 :(得分:0)
Double Quoting可防止一些Bash扩展。例如,您可以通过
找到所有以 Cache 开头的文件find . -name "Cache*"
如果要删除双引号,则{B}会扩展Cache*
,并且只有当前目录中的Cache
个文件匹配。
由于您不使用任何此类字符,因此您无需将seachr术语用双引号括起来。
答案 3 :(得分:0)
在-prune
旁边,你可能会考虑这种更安全的方法
find . -name "Cache" -exec echo "rm -rf \"{}\"" \; > to_be_deleted.txt
在执行
之前仔细检查to_be_delete.txt
sh to_be_deleted.txt