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

Lui*_*cía 6 linux parameters command pipe

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

但它们似乎更复杂.

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

这里有什么问题?:

find . -name myFile 2>&1 | cp /home/myuser/myFile $1
Run Code Online (Sandbox Code Playgroud)

谢谢

sam*_*hen 16

这就是你想要的:

find . -name myFile -exec cp /home/myuser/myFile {} ';'
Run Code Online (Sandbox Code Playgroud)

对此的细分/解释:

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


Bri*_*ain 6

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

您想要使用xargs管道或findexec参数而不是管道。

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
Run Code Online (Sandbox Code Playgroud)

注意:选项-I {}定义{}为占位符,如果它与要执行的命令冲突,您也可以使用其他占位符。

  • 你能举个例子吗?非常感谢。 (2认同)

Bri*_*ell 6

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

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

for f in $(find . -name myFile)
do
    cp something $f
done
Run Code Online (Sandbox Code Playgroud)

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

find . -name myFile -exec cp something "{}" \;
Run Code Online (Sandbox Code Playgroud)

有时-exec是不够的。例如,在这个问题中,他们想使用 Bash 参数扩展来计算文件名。为了做到这一点,您需要通过-exec bash -c 'your command',但随后您将遇到{}替换的引用问题。要解决此问题,您可以使用-print0fromfind打印以空字符(在文件名中无效)分隔的结果,并将其通过管道传输到while read将参数拆分为空值的循环:

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