Linux命令输出为另一个命令的参数

Linux命令输出为另一个命令的参数,linux,parameters,command,pipe,Linux,Parameters,Command,Pipe,我想将命令元素的输出列表作为另一个命令的参数传递。我找到了一些其他页面: 但它们似乎更为复杂 我只想将一个文件复制到调用Linuxfind命令的每个结果中 这里怎么了 find . -name myFile 2>&1 | cp /home/myuser/myFile $1 谢谢管道将一个程序的输出发送到另一个程序的输入cp不在终端读取其输入流,它只使用命令行上的参数 您希望对管道使用xargs,或者使用find的exec参数而不是管道 find . -name myFil

我想将命令元素的输出列表作为另一个命令的参数传递。我找到了一些其他页面:

但它们似乎更为复杂

我只想将一个文件复制到调用Linux
find
命令的每个结果中

这里怎么了

find . -name myFile 2>&1 | cp /home/myuser/myFile $1

谢谢

管道将一个程序的输出发送到另一个程序的输入
cp
不在终端读取其输入流,它只使用命令行上的参数

您希望对管道使用
xargs
,或者使用
find
exec
参数而不是管道

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
注意:选项
-I{}
{}
定义为占位符,如果它与要执行的命令冲突,您也可以使用其他占位符。

这是您想要的:

find . -name myFile -exec cp /home/myuser/myFile {} ';'
这方面的细分/解释:

  • find
    :调用find命令
  • :从当前工作目录开始搜索
  • 由于未指定深度标志,因此将递归搜索所有子文件夹
  • -name myFile
    :查找具有显式名称的文件
    myFile
  • -exec
    :对于搜索结果,使用它们执行其他命令
  • cp/home/myuser/myFile{}
    :复制
    /home/myuser/myFile
    以覆盖
    find
    返回的每个结果;把
    {}
    想象成每个搜索结果的去向
  • “;”:用于分隔在
    find

根据您是否需要担心文件名中有空格或其他特殊字符,有几种方法可以解决此问题

如果所有文件名都没有空格或特殊字符(它们只由字母、数字、破折号和下划线组成),那么下面是一个简单的解决方案。您可以使用
$(command)
执行一个命令,并将结果替换为另一个命令的参数。shell将在空格、制表符或换行符上拆分结果,并将
for
的每个值依次分配给
$f
,并对每个值运行命令

for f in $(find . -name myFile)
do
    cp something $f
done
如果您有空格或制表符,可以使用find的
-exec
选项。传递
-exec命令args
,将
{}
放在要替换文件名的位置,并以
结束参数。您需要引用
{}
以便shell不会解释它们

find . -name myFile -exec cp something "{}" \;
有时
-exec
是不够的。例如,在中,他们希望使用Bash参数扩展来计算文件名。为了做到这一点,您需要传递
-exec bash-c'your command'
,但随后您将在
{}
替换中遇到引用问题。要解决此问题,您可以使用
-print0
from
find
打印以空字符分隔的结果(在文件名中无效),并在读取时将其传送到拆分空参数的
循环:

find . -name myFile -print0 | (while read -d $'\0' f; do
    cp something "$f"
  done)

你能举个例子吗?非常感谢。只需将{}的顺序更改为第二个位置,在/home/myuser/myFile之后,它就可以工作了。谢谢。@LuisAndrésGarcía,啊,我可能误解了你-你想复制一个文件
/home/myuser/myFile
,以覆盖cwd中
find
找到的任何
myFile
?你说得对!)另一个例子,列出任何找到的文件的属性是:find-exec ls-l{}';'