我正在尝试将一组文件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进行设置
使用pipe道input一个awk语句
当你这样做
echo ${FILES[@]} | xargs -i mv '{}' /path/to/destination
xargs将整条线视为单一的论点。 您应该将数组的每个元素分割到一个新行,然后xargs应按预期工作:
printf "%sn" "${FILES[@]}" | xargs -i mv '{}' /path/to/destination
或者如果你的文件名可以包含换行符,你可以这样做
printf "%s