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

时间:2012-11-05 16:35:14

标签: linux parameters command pipe

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

但它们似乎更复杂。

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

这里有什么问题?:

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

由于

3 个答案:

答案 0 :(得分:16)

这就是你想要的:

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

对此的细分/解释:

  • find:调用find命令
  • .:从当前工作目录开始搜索。
  • 由于未指定深度标记,因此将以递归方式搜索所有子文件夹
  • -name myFile:查找名称为myFile
  • 的文件
  • -exec:对于搜索结果,请使用它们执行其他命令
  • cp /home/myuser/myFile {}:复制/home/myuser/myFile以覆盖find返回的每个结果;将{}视为每个搜索结果的位置。
  • ';':用于分隔在find
  • 之后运行的不同命令

答案 1 :(得分:4)

有几种方法可以解决这个问题,具体取决于您是否需要担心名称中包含空格或其他特殊字符的文件。

如果没有文件名包含空格或特殊字符(它们只包含字母,数字,短划线和下划线),那么以下是一个简单的解决方案。您可以使用$(command)执行命令,并将结果替换为另一个命令的参数。 shell会将结果拆分为空格,制表符或换行符,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',但之后您会遇到引用{}替换的问题。要解决此问题,您可以使用-print0中的find来打印用空字符分隔的结果(在文件名中无效),并将其传递给while read循环,该循环在空值上拆分参数:

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

答案 2 :(得分:2)

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

您希望xargs使用管道或find的{​​{1}}参数而不是管道。