Answers:
您只是缺少(假设GNU )的-t
选项:mv
mv
cat /tmp/list.txt | xargs mv -t /app/dest/
或更短(受X Tian的回答启发):
xargs mv -t /app/dest/ < /tmp/list.txt
前导(和可能的尾随)空格将被删除。文件名中的空格将导致问题。
如果文件名中包含空格或制表符或引号或反斜杠,则假定xargs
使用GNU ,则可以使用:
sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
假设您的文件名相对合理(没有换行符或奇怪的字符):
while read file; do mv "$file" /app/dest/; done < list.txt
处理奇怪的文件名(如果文件名带有换行符,则中断):
while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt
cp -Hr
但我不知道OSX是否cp
支持该功能。
纯xargs直接从文件读取
xargs -l -i < flist mv -v {} /app/dst
编辑1-在下面的@Anthon的评论之后,
xargs -I{} < flist mv -v {} /app/dst
-i
被弃用,或者被替换-I暗示-l
/ --max-lines=1
。并且它导致mv
分别为每个文件执行。
mv `cat /tmp/list.txt` /app/dest/
(开始时的空格将被忽略)