有没有办法递归调用 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脚本中运行),尤其是。我不是在寻找解决方案
小智 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)