我正在尝试传递一组文件路径以xargs
将它们全部移动到新位置。我的脚本目前工作如下:
FILES=( /path/to/files/*identifier* )
if [ -f ${FILES[0]} ]
then
mv ${FILES[@]} /path/to/destination
fi
将 FILES 作为数组的原因是,if [ -f /path/to/files/*identifier* ]
如果通配符搜索返回多个文件,则会失败。仅检查第一个文件,因为如果存在任何文件,将执行移动。
我想mv ${FILES[@]} /path/to/destination
用传递给移动每个文件的行${FILES[@]}
替换xargs
。我需要使用xargs
,因为我希望有足够的文件来重载单个mv
. 通过研究,我只能找到移动我已经知道的文件的方法,再次搜索文件。
#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
?
以下是我尝试过的方法及其错误。
尝试 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 ${FILES[@]} | xargs -i mv '{}' /path/to/destination
编辑2:
为了将来参考,我测试了接受的答案方法与我第一次编辑中使用的方法time()
。两种方法运行 4 次后,我的方法平均为 0.659 秒,接受的答案为 0.667 秒。因此,这两种方法的工作速度都比另一种快。