2012-11-05 57 views
6

的参数Linux命令输出我想传递一个命令的元件的输出列表作为另一命令的参数。我已经发现了一些其他的网页:作为另一个命令

,但他们似乎更复杂。

我只是想将文件复制到到Linux find命令拨打电话的每个结果。

这里有什么问题?:

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

感谢

回答

16

这是你想要什么:这

find . -name myFile -exec cp /home/myuser/myFile {} ';' 

细目/解释:

  • find:调用find命令
  • .:开始从当前工作目录中搜索。
  • 由于没有指定任何深度的标志,这将递归地搜索所有子文件夹
  • -name myFile:找到明确的名称myFile
  • -exec文件:用于搜索结果,与他们进行额外的命令
  • cp /home/myuser/myFile {}:副本/home/myuser/myFile覆盖由find到返回的每个结果;将{}想象为每个搜索结果的去向。
  • ​​3210:用于区分不同的命令后find
+0

只需将{}的顺序更改为/ home/myuser/myFile之后的第二个位置,它就可以工作。谢谢。 –

+0

@LuisAndrésGarcía啊,我可能误解了你 - 你想复制一个文件'/ home/myuser/myFile'来覆盖cwd中'find'找到的任何'myFile'? –

+0

你是对的! :)另一个例子,列出任何找到的文件的属性是:find -exec ls -l {}';' –

2

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

您希望使用管道xargs或使用findexec参数而不是管道。

+2

你能举个例子, 请?非常感谢你。 –

3

有一对夫妇的方式来解决这个问题,这取决于你是否需要担心在其名称中空格或其他特殊字符的文件中运行。

如果没有文件名有空格或特殊字符(它们只包含字母,数字,破折号和下划线),再下面是一个简单的解决方案,将工作。您可以使用$(command)来执行命令,并将结果替换为另一个命令的参数。壳将分裂的结果上空格,制表符,或换行符和for每个值依次分配给$f,并且在每个值运行的命令。

for f in $(find . -name myFile) 
do 
    cp something $f 
done 

如果您确实有空格或制表符,您可以使用find的-exec选项。您通过-exec command args,将{}放在您想要替换文件名的位置,并以;结束参数。您需要引用{};以便shell不解释它们。

find . -name myFile -exec cp something "{}" \; 

有时-exec是不够的。例如,在this question中,他们希望使用Bash参数扩展来计算文件名。为了做到这一点,您需要通过-exec bash -c 'your command',但是您会遇到{}替换引用问题。为了解决这个问题,你可以使用从find-print0打印与空字符(这是在文件名中无效)界定的结果,管到一个while read循环,对空值分割参数:

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