使用从终端查找的移动

Using move with find from terminal

这应该很简单,但我似乎无法理解。上下文很少,我得到的文件比方说 test1.txt...test5.txt 分布在几个目录中。我只是想找到它们,并将它们移动到一个目录中。

我可以将 xargsfind 一起使用,但我想在 find 中使用 -exec 选项。其中所有找到的文件将在 "instance"mv 命令中传递(如果我错了请纠正我),所以这里是命令:

find . -name 'text*.txt' -exec mv '{}' collectedDir;

我收到此错误:find: -exec: no terminating ";" or "+"。我显然正在使用分号。那么造成这种情况的问题可能是什么?

在你问之前,find确实找到了所有的文件,我用print查了一下,collectedDir确实存在。

你的 shell 在 find 之前看到 ; 然后吞下它。

你需要逃避它 \; 这样 shell 就不会吃掉它。

也就是说 -exec .. \; 将 运行 命令一次 对每个找到的文件 而不是总共一次。

至 运行 一次性获取尽可能多的文件 -exec ... +

find . -name 'text*.txt' -exec mv '{}' collectedDir +

正如@EtanReisner post 中指出的那样,您忘记了转义分号,如果您不 shell 将其解释为命令分隔符;尝试:

find . -name 'text*.txt' -exec mv '{}' collectedDir \;

您还可以将 findxargs 结合使用,以避免为每个文件调用 mv 命令(如果您有很多文件,这可能会更快),例如:

find . -name 'text*.txt' -print0 | xargs -0 mv -t collectedDir

-0 标志 "escape" 所有可能出现在文件名中的特殊字符(再次像空格或分号)。