如何从标准输入使用 cp?
注意:
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
xargs 通常将其替换的 args 放在最后。你可以这样做:
如果它真的只是 lib 文件,那么 cp /lib/?.lib /tmp/fred/. 自然会起作用。
要真正使用 xargs 来做到这一点,下面是一个将 arg 放在第一位的示例:
xargs normally places its substituted args last. You could just do:
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:假设
/tmp/fred
是一个目录,请使用-t
(--target-directory
选项)指定它:Assuming
/tmp/fred
is a directory, specify it using the-t
(--target-directory
option):您的 xargs 版本可能接受
-I
:Your version of xargs probably accepts
-I
:正如 Sinan Ünür 的回答,
如果没有 -t 支持
As answered by Sinan Ünür
if no -t support
为什么不尝试类似的操作:
我认为您的命令失败了,因为 xargs 创建了以下命令:
也就是说,它最终尝试将所有内容复制到 /lib/d.lib,这不是一个目录,因此您的错误消息。
Why not try something like:
I think your command is failing because xargs creates the following command:
That is, it ends up trying to copy everything to /lib/d.lib, which is not a directory, hence your error message.
目标目录必须是命令行上的最后一个目录,但是 xargs 将 stdin 附加到命令行的末尾,因此在您的尝试中它最终作为第一个参数。
您可以在使用 xargs 之前将目标附加到 /tmp/foo,或者在反引号中使用 cat 在目标之前插入源文件:
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:
假设 /tmp/fred 是一个存在的目录,您可以使用 while 循环
Assuming /tmp/fred is a directory that exists, you could use a while loop