笔记:
# 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 不是目录
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:~$
假设/tmp/fred
是一个目录,使用-t
(--target-directory
选项) 指定它:
$ cat /tmp/foo | xargs cp -t /tmp/fred
您的 xargs 版本可能接受-I
:
xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
正如 Sinan Ünür 所回答的那样
cat /tmp/foo | xargs cp -t /tmp/fred
如果没有 -t 支持
( cat /tmp/foo; echo /tmp/fred ) | xargs cp
为什么不尝试类似的东西:
cp /lib/*.lib /tmp/fred
我认为您的命令失败了,因为 xargs 创建了以下命令:
cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib
也就是说,它最终会尝试将所有内容复制到 /lib/d.lib,这不是目录,因此会出现错误消息。
目标目录必须是命令行上的最后一件事,但是xargs
将 stdin 附加到命令行的末尾,因此在您的尝试中它最终作为第一个参数。
您可以在使用 xargs 之前将目标附加到 /tmp/foo,或者在反引号中使用 cat 在目标之前插入源文件:
cp `cat /tmp/foo` /tmp/fred/
假设 /tmp/fred 是一个存在的目录,您可以使用 while 循环
while read file
do
cp $file /tmp/fred
done < /tmp/foo