我想将命令元素的输出列表作为另一个命令的参数传递。我发现了一些其他页面:
但它们似乎更复杂。
我只想将文件复制到调用 Linuxfind
命令的每个结果中。
这里有什么问题?:
find . -name myFile 2>&1 | cp /home/myuser/myFile $1
谢谢
我想将命令元素的输出列表作为另一个命令的参数传递。我发现了一些其他页面:
但它们似乎更复杂。
我只想将文件复制到调用 Linuxfind
命令的每个结果中。
这里有什么问题?:
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
to 返回的每个结果;想想{}
每个搜索结果的去向。';'
:用于分隔要运行的不同命令find
有几种方法可以解决这个问题,具体取决于您是否需要担心名称中包含空格或其他特殊字符的文件。
如果所有文件名都没有空格或特殊字符(它们仅由字母、数字、破折号和下划线组成),那么以下是一个可行的简单解决方案。您可以使用$(command)
执行命令,并将结果替换为另一个命令的参数。shell 会将结果拆分为空格、制表符或换行符,并依次for
分配每个值,并对每个值运行命令。$f
for f in $(find . -name myFile)
do
cp something $f
done
如果确实有空格或制表符,则可以使用 find 的-exec
选项。您通过-exec command args
,将{}
文件名放在要替换的位置,并以 . 结尾的参数;
。您需要引用{}
and;
以便 shell 不会解释它们。
find . -name myFile -exec cp something "{}" \;
有时-exec
是不够的。例如,在这个问题中,他们想使用 Bash 参数扩展来计算文件名。为此,您需要通过-exec bash -c 'your command'
,但随后您将遇到引用{}
替换问题。为了解决这个问题,您可以使用-print0
fromfind
打印以空字符(在文件名中无效)分隔的结果,并将其通过管道传递到while read
在空值上拆分参数的循环:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
管道会将一个程序的输出发送到另一个程序的输入。 cp
不会从终端的输入流中读取,它仅使用命令行上的参数。
您想xargs
与管道或find
'exec
参数一起使用而不是管道。
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
注意:选项-I {}
定义{}
为占位符,如果它与要执行的命令冲突,您也可以使用其他占位符。