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

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

  • 如何在stdout上显示一个Linux命令的输出,并将其输出到另一个命令?
  • 使用bash命令的输出(使用pipe道)作为另一个命令的参数

但他们似乎更复杂。

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

这里有什么问题?

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

谢谢

Solutions Collecting From Web of "Linux命令输出作为另一个命令的参数"

这是你想要的:

 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会将结果拆分为空格,制表符或换行符,并将每个值依次分配给$f ,然后对每个值运行该命令。

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

如果你有空格或制表符,你可以使用find的-exec选项。 你传递-exec command args ,把{}放在想要替换文件名的地方,然后用a ;结束参数; 。 你需要引用{}; 这样shell就不会解释它们了。

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

有时候, -exec是不够的。 例如,在这个问题中 ,他们想使用Bash参数扩展来计算文件名。 为了做到这一点,你需要传递-exec bash -c 'your command' ,但是你会遇到带有替换的引用问题。 为了解决这个问题,你可以使用-print0find来打印以空字符(这在文件名中是无效的)分隔的结果,并且将它管到一段while read循环,以便在空值上拆分参数:

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

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

你要么使用管道xargsfind exec参数,而不是管道。