如何从标准输入使用 cp?

发布于 2024-08-08 11:04:29 字数 222 浏览 7 评论 0原文

注意:

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

Note:

# cat /tmp/foo - regular file

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

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

cp: target /lib/d.lib is not a directory

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

归途 2024-08-15 11:04:29

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:~$ 

xargs normally places its substituted args last. You could just do:

$ cp `cat /tmp/foo` /tmp/fred/.

If it's really just the lib files, then cp /lib/?.lib /tmp/fred/. would naturally work.

And to really do it with xargs, here is an example of putting the arg first:

0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$ 
轻许诺言 2024-08-15 11:04:29

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

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

Assuming /tmp/fred is a directory, specify it using the -t (--target-directory option):

$ cat /tmp/foo | xargs cp -t /tmp/fred
清风无影 2024-08-15 11:04:29

您的 xargs 版本可能接受 -I

xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo

Your version of xargs probably accepts -I:

xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
千里故人稀 2024-08-15 11:04:29

正如 Sinan Ünür 的回答,

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

如果没有 -t 支持

( cat /tmp/foo; echo /tmp/fred ) | xargs cp

As answered by Sinan Ünür

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

if no -t support

( cat /tmp/foo; echo /tmp/fred ) | xargs cp
深居我梦 2024-08-15 11:04:29

为什么不尝试类似的操作:

cp /lib/*.lib /tmp/fred

我认为您的命令失败了,因为 xargs 创建了以下命令:

cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib

也就是说,它最终尝试将所有内容复制到 /lib/d.lib,这不是一个目录,因此您的错误消息。

Why not try something like:

cp /lib/*.lib /tmp/fred

I think your command is failing because xargs creates the following command:

cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib

That is, it ends up trying to copy everything to /lib/d.lib, which is not a directory, hence your error message.

完美的未来在梦里 2024-08-15 11:04:29

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

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

    cp `cat /tmp/foo` /tmp/fred/

The destination directory needs to be the last thing on the command line, however xargs appends stdin to the end of the command line so in your attempt it ends up as the first argument.

You could append the destination to /tmp/foo before using xargs, or use cat in backticks to interpolate the sorce files before the destination:

    cp `cat /tmp/foo` /tmp/fred/
辞慾 2024-08-15 11:04:29

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

while read file
do
    cp $file /tmp/fred
done < /tmp/foo

Assuming /tmp/fred is a directory that exists, you could use a while loop

while read file
do
    cp $file /tmp/fred
done < /tmp/foo
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文