为什么 -exec 会影响 Linux 中 find 的输出?

为什么 -exec 会影响 Linux 中 find 的输出?

如果我运行这个命令......

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db"

... 它如预期的那样给出了匹配文件的列表。但是,如果我使用此命令...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db" -exec rm -v {} \;

... 什么都没有删除。同样,使用 echo 时,什么都没有打印出来...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db" -exec echo {} \;

怎么会?

答案1

您必须正确地对您的表情进行分组 - 目前-exec仅适用于最后一个-or分支。

sudo find /storage \( -name "*~" -or -name ".*~" -or -name "#.*#" -or -name ".DS_Store" -or -name "Thumbs.db" \) -exec rm -v {} \;

只要记住,这-exec只是一个表达式,如果命令返回零,则返回 true,因此运行该命令只是一个副作用。

答案2

find Documents/ -iname '*.txt' -exec echo {} \;
 -or -iname '*.cpp' -exec echo {} \;

但是这有效。希望这能对你有所帮助。如果你将 exec 与 all -or 分开使用,该命令将有效。

不过,我已经找到了解决您问题的方法。

for file in $(find Documents/ -iname '*.txt' 
-or -iname '*.cpp'| awk '{print $1}'); do rm $file; done

相关内容