突然发现 find 命令挺好用的
Moevis
今天在用 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
作用就很棒。