我正在尝试将一组文件路径传递给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
为了将来参考,我使用time()
测试了接受的答案方法与我在第一次编辑中的方法。运行两种方法4次后,我的方法平均为0.659s,接受的答案为0.667s。所以这两种方法都没有比另一种更快。
答案 0 :(得分:32)
当你这样做时
echo ${FILES[@]} | xargs -i mv '{}' /path/to/destination
xargs将整行视为一个问题。您应该将数组的每个元素拆分为一个新行,然后xargs
应该按预期工作:
printf "%s\n" "${FILES[@]}" | xargs -i mv '{}' /path/to/destination
或者,如果您的文件名可以包含换行符,则可以执行
printf "%s\0" "${FILES[@]}" | xargs -0 -i mv '{}' /path/to/destination