我想传递一个命令的元件的输出列表作为另一命令的参数。 我已经发现了一些其他页面:
- 如何显示在stdout Linux命令的输出,并还管到另一个命令?
- 使用bash命令(管)的输出作为另一个命令中的参数
但他们似乎更复杂。
我只是想将文件复制到到Linux调用的每个结果find
命令。
这里有什么问题?:
find . -name myFile 2>&1 | cp /home/myuser/myFile $1
谢谢
我想传递一个命令的元件的输出列表作为另一命令的参数。 我已经发现了一些其他页面:
但他们似乎更复杂。
我只是想将文件复制到到Linux调用的每个结果find
命令。
这里有什么问题?:
find . -name myFile 2>&1 | cp /home/myuser/myFile $1
谢谢
这是你想要什么:
find . -name myFile -exec cp /home/myuser/myFile {} ';'
这方面的一个细分/解释:
find
:调用find命令 .
:从开始的当前工作目录进行搜索。 -name myFile
:找到明确的名称的文件myFile
-exec
:对于搜索结果,执行与他们额外的命令 cp /home/myuser/myFile {}
拷贝/home/myuser/myFile
覆盖由返回的每个结果find
到; 认为{}
为其中每个搜索结果去。 ';'
:用于区分不同的命令后运行find
有一对夫妇的方式来解决这个问题,这取决于你是否需要担心在其名称中空格或其他特殊字符的文件。
如果没有文件名有空格或特殊字符(它们只包含字母,数字,破折号和下划线),再下面是一个简单的解决方案,将工作。 您可以使用$(command)
执行命令,并将结果代入另一个命令的参数。 外壳将拆分结果的空格,制表符,换行符,并for
分配给每个价值$f
反过来,并在每个值运行命令。
for f in $(find . -name myFile)
do
cp something $f
done
如果您有空格或制表符,你可以使用发现的-exec
选项。 您传递-exec command args
,把{}
您想要的文件名被取代,并结束与一个参数;
。 你需要引用{}
和;
从而使外壳不作说明。
find . -name myFile -exec cp something "{}" \;
有时-exec
是不够的。 例如,在这个问题 ,他们想用猛砸参数展开来计算的文件名。 为了做到这一点,你需要通过-exec bash -c 'your command'
,但随后你会遇到与报价问题{}
替代。 为了解决这个问题,你可以使用-print0
从find
到打印带有空字符(这是在文件名中无效)界定的结果,它管的while read
循环,对空值分割参数:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
管道将一个程序的输出发送到另一个的输入。 cp
不从在所述终端的输入流中读取,它仅仅使用在命令行上的参数。
你想要么使用xargs
与管或find
的exec
的说法,而不是管道。