像下面这样的东西就是我所追求的,但是我的代码不起作用,无论我如何逃脱{}
并且+
;
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) - 调用的问题。