【问题标题】:find outputs result but -exec ignores it查找输出结果但 -exec 忽略它
【发布时间】:2021-12-03 11:23:24
【问题描述】:

我写了一个简单的命令来查找超过一个月的文件夹并删除它们。 这是命令:

find . -type d -mtime +31 -exec bash -c 'rm -rfv "$0"' {} \;

它在大多数情况下都可以正常工作,但有时,-exec 会“忽略”结果。 运行一次命令后,如果我在没有 -exec 的情况下运行 find,它仍然会找到一些超过一个月的文件夹尚未删除。

然后我尝试了一个简单的回显并没有输出:

$ find . -type d -mtime +31
./folder_A
./Folder_B
$ find . -type d -mtime +31 -exec bash -c 'echo  "$0"' {} \;
<No output>

我找到了一个使用 grep 的工作区,但我想知道为什么 -exec 会忽略一些结果。 有谁知道吗?

这里是解决方法:

find . -type d -mtime +31 | grep . --color=never | while read line ; do rm -rvf "$line" ; done

【问题讨论】:

  • find -type d -mtime +31 -exec rm -rfv {} \;find -type d -mtime +31 -delete?
  • 很奇怪。会不会是这些文件夹名称嵌入了改变echo 行为的隐藏字符?你试过cat -v &lt;&lt;&lt; "$0"而不是echo "$0"吗?
  • @Cyrus:如果目录匹配 -mtime +31 但包含的文件不匹配则不起作用 - 文件不会被删除,并且目录上的删除失败,因为它不是空的。 AFAIK find ... -delete 没有“强制”选项。
  • 旁注:这是非常低效的。 ... -exec bash -c 'rm -rfv "$0" "$@"' {} + 或下面answer 中列出的+ 的更好版本之一。

标签: bash find rm


【解决方案1】:

你的 find 命令对我来说似乎有点奇怪。我建议改变:

find . -type d -mtime +31 -exec bash -c 'rm -rfv "$0"' {} \;

到:

find . -type d -mtime +31 -exec rm -rfv {} \;

甚至更好(提高性能):

find . -type d -mtime +31 -exec rm -rfv {} +

如果您坚持显式调用 Bash(尽管我想不出任何理由,因为 rm 不是 Bash 内置的),我建议更改:

find . -type d -mtime +31 -exec bash -c 'rm -rfv "$0"' {} \;

到:

find . -type d -mtime +31 -exec bash -c 'rm -rfv {}' \;

包含echo 的查找命令也是如此。

【讨论】:

  • 你说得对,我这里不再需要 bash(在我转移到单个命令之前,我在这里运行了多个命令)。
  • “+”的作用是什么?我以前从未听说过。
  • @Airmoi:+ 指示find 将它找到的所有内容作为一个长参数列表传递给-exec 指定的命令。换句话说,这个命令(这里是rm)只运行一次,有很多参数。当使用\; 时,该命令将针对找到的每个项目单独运行。
  • @Airmoi:实际上+ 可以多次运行该命令——如果参数列表太长而shell无法处理。所以你不能依赖只有一个调用。
  • @DevSolar:你当然是对的,我故意省略了这部分以保持解释简单。
猜你喜欢
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2016-07-11
相关资源
最近更新 更多