如何从stdin使用cp?

时间:2009-10-22 21:30:16

标签: cygwin stdin cp

注意:

# 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不是目录

7 个答案:

答案 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