是否可以将“find -exec”嵌套在另一个“find -exec”中?

是否可以将“find -exec”嵌套在另一个“find -exec”中?

像下面这样的东西就是我所追求的,但是我的代码不起作用,无论我如何逃脱{}并且+ ;

find ./ -maxdepth 1 -type d -name '.*' -exec \
    find {} -maxdepth 1 -type f -name '*.ini' -exec \
        md5sum \{\} \\; \;

看到这个之后Unix-&-Linux 问题,我发现下面的代码可以工作,但它不是嵌套的寻找因此,我怀疑有更好的方法来完成这项特定的工作。

find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
    find "$x" -maxdepth 1 -type f -name "*.ini" \
    -exec md5sum \{\} \;; \
done' _ {} \+

有没有某种方法可以嵌套find -exec而不需要调用 shell(如上所述)及其所有古怪的引用和转义约束?

或者可以使用多个参数的混合直接在单个 find 命令中完成此操作吗?

答案1

我会尝试使用单个查找,例如:

find .*/ -maxdepth 1 -type f -name '*.ini' -execdir md5sum {} +

甚至(find根本没有,只是 shell 通配符)

md5sum .*/*.ini

尽管这缺少-type f检查,所以仅当您没有以 . 结尾的目录/非文件时才有效.ini。如果你这样做你可以使用

for x in .*/*.ini; do 
    if [ -f "$x" ]; then 
        md5sum "$x"
    fi
done

然而,这将失去只需要一次 md5sum 调用的优势。

编辑

对于通用且安全的链接方法find,您可以执行类似的操作

find <paths> <args> -print0 | xargs -0 -I{.} find {.} <args for second find> [etc.]

答案2

您原来的问题不需要递归调用 find ,但我认为这不是重点。

我相信不可能以您想要的方式递归调用 find 。

以下也不是递归调用 find (或嵌套,无论它叫什么),但是您不能只获取第一个 find 的结果集并将其提供给第二个 find 吗?我本能地会这样做:

find `find ./ -maxdepth 1 -type d -name '.*'` \
    -maxdepth 1 -type f -name '*.ini' -exec md5sum {} \;

您还可以用于xargs执行第二个查找。

更新:

我想补充一点,因为大多数 UNIX 实用程序都采用多个文件名参数而不是一个,所以您通常可以完全避免-exec

md5sum `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`

\嵌套反引号时,只需在内部反斜杠之前添加反斜杠即可。

如果我们想象md5sum只需要一个文件名参数,我们总是可以将它包装在一个for循环中:

for f in `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`
do
    md5sum $f
done

请注意,如果涉及以空格开头-或包含空格的文件/目录名称,这将变得更加困难。 UNIX 实用程序不能很好地与它们配合。在这种情况下,需要添加./,或引号。--

显然最初的例子不是一个好的例子,因为我们可以这样做:

md5sum .*/*.ini

答案3

至少我设法嵌套了 2 个 find 命令:

find ~ -maxdepth 1 -type d -name '.*' -execdir \
    find {} -maxdepth 1 -type f -name '*.ini' \;

但我没有解决从那里调用另一个 -exec(dir) - 调用的问题。

相关内容