从 find 调用的 find 执行命令

uml*_*ute 3 shell find

有没有办法递归调用 find ?

我只想在匹配另一个模式的目录中搜索匹配给定模式的文件。

基本上:

for each (sub)directory D matching "*.data"
do
  for each file F in directory D (with subdirs) matching "*.important.txt"
  do
    run command foo on F
  done
done
Run Code Online (Sandbox Code Playgroud)

现在,如果我忽略最里面的要求(在 F 中运行命令 foo),它非常简单:

find . -type d -name "*.data" \
     -exec find \{\} -type f -name "*.important.txt" \;
Run Code Online (Sandbox Code Playgroud)

但是,我还没有找到将命令传递给内部find. 例如,每次调用内部查找时,以下内容都会打印出find: missing argument to `-exec'

 find . -type d -name "*.data" \
      -exec find \{\} -type f -name "*.important.txt" \
                 -exec "foo \{\} \;" \;
Run Code Online (Sandbox Code Playgroud)

任何解决方案都应该符合 posix(可在/bin/sh脚本中运行),尤其是。我不是在寻找解决方案

  • 将内部 find 包装成一个单独的 shell 脚本
  • 将内部 find 包装成一个 bash 函数

小智 5

find根据自己的结果运行,您可以使用(或)的-c参数来防止外部 find 命令对内部进行特殊处理。但是,您随后需要将来自外部 find 的结果作为参数传递给,可以使用以下内容进行扩展:shbash{}sh$0

find . -type d -name "*.data" \
      -exec sh -c 'find "$0" -type f -name "*.important.txt" -exec echo \{\} \;' \{\} \;
Run Code Online (Sandbox Code Playgroud)

注意:$0应该用引号 ( "$0") 来防止目录名称包含空格的问题。

这并不是真正的“递归”解决方案,因为它不允许在没有一些毛茸茸的转义的情况下进行任意深度嵌套,但它确实支持find -exec您在示例中要求的两个级别的s。

如果您的示例与您的实际问题相似,您也可以尝试使用-path参数 find 代替:

find . -path '*.data/*important.txt'
Run Code Online (Sandbox Code Playgroud)