当我运行以下命令时:
> 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