如何将-I和-n与xargs结合使用?

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


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

但是,当要移动的文件太多时,我达到了传递给的参数数量的限制mv。xargs有一个-n似乎非常适合的方法:


$ echo {0..9} | xargs -n 3 echo

0 1 2

3 4 5

6 7 8

9

然而,-I暗示-L 1,所以我不能用-I同-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。


开满天机
浏览 353回答 3
3回答

白板的微信

该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 scriptlet “使用”所有参数($@)):find /foo -name 'bar*' | tr '\n' ' ' | xargs sh -c 'mv "$@" /dest' --

慕丝7291255

该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 scriptlet “使用”所有参数($@)):find /foo -name 'bar*' | tr '\n' ' ' | xargs sh -c 'mv "$@" /dest' --

至尊宝的传说

如果您要使用来查找常规文件find,则应使用-type f,否则可能会找到目录。xargs您无需在这里使用,因为您已经内置了该功能find。使用GNU mv:find /foo -type f -name 'bar*' -exec mv -t /dest {} +这不会检测到具有相同名称的目标文件。为此,请使用find /foo -type f -name 'bar*' -exec sh -c '    for name do        destname="/dest/${name##*/}"        if [ ! -f "$destname" ]; then            mv "$name" "$destname"        else            printf '%s exists already, will not copy %s\n' "$destname" "$name" >&2        fi    done' sh {} +这将拒绝移动将覆盖文件的文件/dest(并报告这些文件)。这些命令将与所有有效的Unix文件名一起使用。
打开App,查看更多内容
随时随地看视频慕课网APP