今天在用 mv 命令移动文件时候出现一个问题,使用下面命令报错:

$ mv *.jpg dest/
zsh: argument list too long: mv

我第一次发现是我们的命令行替我们展开了通配符命令——而不是由程序来做的。但是由于同个目录下文件过多了,展开这个命令台城会报 argument list too long 的问题,所以我们只能一个个来 mv 了。

方案一

一种很简单的方法是写个 sh:

for f in *.jpg
do
	mv $f dest/
done

方案二

当然 xargs 也是一个好东西:

$ find . -name "*.jpg" -print0 | xargs -n 1000 -I '{}' mv '{}'  dest/

其中 xargs 中的 -n 表示将多个作为一组,而 find 中的 -print0 表示将每个 find 找到的匹配项合并为一行输出,与之对应的是 -print

方案3:find 命令

后来发现实际上 find 命令单独就可以做到这个工作:

find . -name '*.jpg' -exec mv {} folder \;

其中 {} 表示要被替换为查找到的文件名的位置,而 \; 是必须的,表示命令结束。我还试了一下如果命令中有两个{},那么这两个地方都会被替换成相同的文件名。

总之,我记性不好,经常会忘 xargs 的参数,所以这个 find -exec 作用就很棒。