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

6
3个回答

20

这就是你想要的:

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

这是一个解释:

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

只需将{}的顺序更改为/home/myuser/myFile之后的第二个位置,它就可以工作了。谢谢。 - Luis Andrés García
@LuisAndrésGarcía,啊,我可能误解了你的意思 - 你想复制一个文件/home/myuser/myFile来覆盖在当前工作目录下通过find找到的任何myFile吗? - sampson-chen
你说得对! :) 另一个例子,列出任何找到的文件的属性是:find -exec ls -l {} ';' - Luis Andrés García

6

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

如果没有文件名包含空格或特殊字符(只包含字母、数字、短横线和下划线),那么以下是一个简单的解决方案。您可以使用$(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)

6
管道可将一个程序的输出发送到另一个程序的输入。cp不会从终端读取其输入流,而只是使用命令行上的参数。
您可以使用管道和xargs,或者使用findexec参数而不是管道。
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}

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


2
你能给个例子吗?非常感谢。 - Luis Andrés García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接