为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开满天机 2021-04-09 13:34:55
我想使用find和移动大量文件xargs。通常我会这样做:find /foo -name 'bar*' | tr '\n' ' ' | xargs -I % echo mv % /dest但是,当要移动的文件太多时,我达到了传递给的参数数量的限制mv。xargs有一个-n似乎非常适合的方法:$ echo {0..9} | xargs -n 3 echo0 1 23 4 56 7 89然而,-I暗示-L 1,所以我不能用-I同-n:$ echo {0..9} | xargs -n 3 -I % echo % /dest0 1 2 3 4 5 6 7 8 9 /dest我希望这样的行为:$ echo {0..9} | xargs -n 3 -I % echo % /dest0 1 2 /dest3 4 5 /dest6 7 8 /dest9 /dest这可能xargs吗?我的机器上没有GNU Parallel。
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超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' --


查看完整回答
反对 回复 2021-04-16
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

该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' --


查看完整回答
反对 回复 2021-04-16
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

如果您要使用来查找常规文件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文件名一起使用。


查看完整回答
反对 回复 2021-04-16
  • 3 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信