4

笔记:

# cat /tmp/foo- 常规文件

/lib/a.lib
/lib/b.lib
/lib/c.lib
/lib/d.lib

cat /tmp/foo | xargs cp /tmp/fred

cp: 目标 /lib/d.lib 不是目录

4

7 回答 7

11

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:~$ 
于 2009-10-22T21:34:48.577 回答
5

假设/tmp/fred是一个目录,使用-t(--target-directory选项) 指定它:

$ cat /tmp/foo | xargs cp -t /tmp/fred
于 2009-10-22T21:38:44.870 回答
3

您的 xargs 版本可能接受-I

xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
于 2009-10-22T21:42:11.673 回答
1

正如 Sinan Ünür 所回答的那样

cat /tmp/foo | xargs cp -t /tmp/fred

如果没有 -t 支持

( cat /tmp/foo; echo /tmp/fred ) | xargs cp
于 2015-07-27T08:16:22.013 回答
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,这不是目录,因此会出现错误消息。

于 2009-10-22T21:34:48.063 回答
0

目标目录必须是命令行上的最后一件事,但是xargs将 stdin 附加到命令行的末尾,因此在您的尝试中它最终作为第一个参数。

您可以在使用 xargs 之前将目标附加到 /tmp/foo,或者在反引号中使用 cat 在目标之前插入源文件:

    cp `cat /tmp/foo` /tmp/fred/
于 2009-10-22T21:38:05.837 回答
0

假设 /tmp/fred 是一个存在的目录,您可以使用 while 循环

while read file
do
    cp $file /tmp/fred
done < /tmp/foo
于 2009-10-22T21:52:27.267 回答