使用find + xargs移动文件:目标不是目录?


9

当我运行以下命令时:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

我收到数百行这样说:

mv: target `/foo/bar/XX.csv` is not a directory

为什么?我以为xargs会执行:

mv /foo/barXX.csv some_dir

对于find找到的每个文件。这是怎么回事?顺便说一下,这是zsh

更新:

更新1:

我试过了:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

但是然后我得到了几行像:

mv: cannot stat `{}': No such file or directory

尽管我认为该命令可以正确移动我的文件。

更新2:

单独-t使用时,我似乎不需要该选项mv。例如

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

效果很好。为什么-t在使用时需要xargs

Answers:


14

假设您拥有GNU(find,,xargsmv),请将命令更改为:

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

手册页摘录mv

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

上面xargs ...将构造命令,以便移动调用将如下所示:

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

不需要xargs

您只需find完成所有工作即可跳过此方法:

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

为什么需要mv -t ...

这与xargs构造文件集以传递到每次将要运行的命令(即mv ...)的方式有关。

当您mv自己手动运行命令时,您可以控制传递给它的文件名数量,因此您不必担心需要使用,-t my_dir因为您始终会将目标目录放在最后。

参考文献


谢谢!这非常有帮助。我有点困惑(请参阅我的更新)
Amelio Vazquez-Reina

1
构造的命令是mv -t some_dir 1.csv 2.csv 3.csv ...最后一个文件参数。这是问题中的错误,为了使用{}您必须将传递-I {}xargs
frostschutz

谢谢。这说明了一切。我在更新2中遇到的第二个问题呢?您知道为什么我不需要-t多个文件和一个带有常规目录的目录mv吗?
2013年

1
@ user815423426-今晚有机会我会稍后进行更新,我知道原因。
slm

@ user815423426-我更新了问题,让我知道wrt是否有意义mv -t
slm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.