# cat /tmp/foo
- 常规文件
/lib/a.lib
/lib/b.lib
/lib/c.lib
/lib/d.lib
cat /tmp/foo | xargs cp /tmp/fred
cp:target /lib/d.lib不是目录
答案 0 :(得分:10)
xargs通常将其替换的args放在最后。你可以这么做:
$ cp `cat /tmp/foo` /tmp/fred/.
如果它只是lib文件,那么cp /lib/?.lib /tmp/fred/.
自然会起作用。
要真正用xargs
做到这一点,这里有一个将arg放在第一位的例子:
0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$
答案 1 :(得分:2)
假设/tmp/fred
是目录,请使用-t
(--target-directory
选项)指定目录:
$ cat /tmp/foo | xargs cp -t /tmp/fred
答案 2 :(得分:2)
您的xargs版本可能接受-I
:
xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
答案 3 :(得分:0)
为什么不尝试这样的事情:
cp /lib/*.lib /tmp/fred
我认为你的命令失败了,因为xargs创建了以下命令:
cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib
也就是说,它最终会尝试将所有内容复制到/lib/d.lib,这不是目录,因此是您的错误消息。
答案 4 :(得分:0)
目标目录需要是命令行中的最后一个,但是xargs
将stdin附加到命令行的末尾,因此在您尝试时它最终会作为第一个参数。
您可以在使用xargs之前将目标附加到/ tmp / foo,或者在反引号中使用cat在目标之前插入sorce文件:
cp `cat /tmp/foo` /tmp/fred/
答案 5 :(得分:0)
假设/ tmp / fred是一个存在的目录,你可以使用while循环
while read file
do
cp $file /tmp/fred
done < /tmp/foo
答案 6 :(得分:0)
正如SinanÜnür所回答的
cat /tmp/foo | xargs cp -t /tmp/fred
如果没有-t支持
( cat /tmp/foo; echo /tmp/fred ) | xargs cp