首页 > 解决方案 > 如何将 -I 和 -n 与 xargs 结合使用?

问题描述

find我想使用and移动大量文件xargs。通常我会这样做:

find /foo -name 'bar*' | tr '\n' ' ' | xargs -I % echo mv % /dest

但是,当要移动的文件太多时,我达到了要传递给的参数数量的限制mvxargs有一个-n似乎很适合这个:

$ echo {0..9} | xargs -n 3 echo
0 1 2
3 4 5
6 7 8
9

但是,-I暗示-L 1,所以我不能使用-Iwith -n

$ echo {0..9} | xargs -n 3 -I % echo % /dest
0 1 2 3 4 5 6 7 8 9 /dest

我希望有这样的行为:

$ echo {0..9} | xargs -n 3 -I % echo % /dest
0 1 2 /dest
3 4 5 /dest
6 7 8 /dest
9 /dest

这可能xargs吗?我的机器上没有 GNU Parallel。

标签: linuxxargs

解决方案


mv命令(至少来自 Linux coreutils)具有-t与此用例完美匹配的方便标志:

find /foo -name 'bar*' | tr '\n' ' ' | xargs mv -t /dest

上面还支持保留任何奇怪的文件名而不进行文件名按摩

find /foo -name 'bar*' -print0 | xargs -0 mv -t /dest

如果出于某种原因你想像往常一样使用 mv,下面也可以工作(即使sh 用脚本来“使用”所有参数($@)):

find /foo -name 'bar*' | tr '\n' ' ' | xargs sh -c 'mv "$@" /dest' --

推荐阅读