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

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

当我运行以下命令时:

> 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

答案1

假设您有 GNU ( find, xargs, & mv),请将命令更改为:

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

摘自mv手册页

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

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

 $ 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因为您总是将目标目录放在最后。

参考

答案2

您还可以使用 ls 命令代替 find 命令:

ls /foot/bar/*.csv | xargs  mv -t some_dir

相关内容