微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将现有数组中的所有元素传递给xargs

我正在尝试将一组文件path传递给xargs以将它们全部移到新的位置。 我的脚本目前的工作如下:

FILES=( /path/to/files/*identifier* ) if [ -f ${FILES[0]} ] then mv ${FILES[@]} /path/to/destination fi

将FILES作为数组的原因是因为如果通配符search返回多个文件, if [ -f /path/to/files/*identifier* ]失败。 只有第一个文件被检查,因为如果存在任何文件,移动将被执行。

我想用一个将${FILES[@]}传递给xargs的行来replacemv ${FILES[@]} /path/to/destination来移动每个文件。 我需要使用xargs因为我希望有足够的文件来重载一个mv 。 通过研究,我只能find移动文件方法,我已经知道再次search文件

#Method 1 ls /path/to/files/*identifier* | xargs -i mv '{}' /path/to/destination #Method 2 find /path/to/files/*identifier* | xargs -i mv '{}' /path/to/destination

有没有办法可以将现有数组${FILES[@]}中的所有元素传递给xargs ?

下面是我尝试过的方法错误

Shell脚本通配符扩展问题

将string拆分成bash中的数组

bash或sh中的'='和'=='运算符是否有区别?

如何testing一个进程是否在bash中运行grep?

返回string值*在返回呼叫时展开

尝试1

echo ${FILES[@]} | xargs -i mv '{}' /path/to/destination

错误

mv: cannot stat `/path/to/files/file1.zip /path/to/files/file2.zip /path/to/files/file3.zip /path/to/files/file4.zip': No such file or directory

尝试2 :我不确定是否可以直接执行xargs 。

xargs -i mv ${FILES[@]} /path/to/destination

错误:没有输出错误消息,但在该行之后挂起,直到我手动停止它。

编辑:find作品

我试了下面,它移动了所有的文件。 这是做这件事的最好方法吗? 它是一个一个的移动文件,所以terminal不会超载?

find ${FILES[@]} | xargs -i mv '{}' /path/to/destination

编辑2:

为了将来的参考,我使用time()在第一次编辑中testing了接受的答案方法方法。 两种方法运行4次后,我的方法平均为0.659s,接受的答案为0.667s。 所以这两种方法都不能比其他方法更快。

用cron进行设置

如果父进程退出,则挂起subprocess退出

检查两个文件的一部分的相等性

用bash从文本文件删除

使用pipe道input一个awk语句

当你这样做

echo ${FILES[@]} | xargs -i mv '{}' /path/to/destination

xargs将整条线视为单一的论点。 您应该将数组的每个元素分割到一个新行,然后xargs应按预期工作:

printf "%sn" "${FILES[@]}" | xargs -i mv '{}' /path/to/destination

或者如果你的文件名可以包含换行符,你可以这样做

printf "%s" "${FILES[@]}" | xargs -0 -i mv '{}' /path/to/destination

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐