我希望能够将一个命令的输出元素列表作为另一个命令的参数传递。我查找了一些其他页面:但它们似乎更加复杂。我只想将文件复制到Linux
find
命令调用的每个结果中。 这里有什么问题吗?find . -name myFile 2>&1 | cp /home/myuser/myFile $1
谢谢
find
命令调用的每个结果中。 这里有什么问题吗?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
返回的结果中进行覆盖;将{}
视为每个搜索结果的位置。';'
:用于分隔在find
之后运行的不同命令。有几种方法可以解决这个问题,具体取决于您是否需要关注文件名中带有空格或其他特殊字符的文件。
如果没有文件名包含空格或特殊字符(只包含字母、数字、短横线和下划线),那么以下是一个简单的解决方案。您可以使用$(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
并不足够。例如,在这个问题中,他们想使用Bash参数展开来计算文件名。为了做到这一点,你需要传递-exec bash -c 'your command'
,但是然后你会遇到{}
替换的引号问题。为了解决这个问题,你可以使用来自find
的-print0
以空字符(在文件名中无效)分隔打印结果,并将其管道传递到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 {}
将{}
定义为占位符,如果与要执行的命令冲突,您可以选择其他占位符。
/home/myuser/myFile
来覆盖在当前工作目录下通过find
找到的任何myFile
吗? - sampson-chen