是否可以在 linux 中可靠地嵌套 find -exec 命令?

Is it possible to reliably nest find -exec commands in linux?

我需要修复大型 nfs 卷上目录子集中的大量文件的权限。

在构建解决方案时,我首先使用 find 来获取我想要的目录列表:

find . -type d -regex "^./[0-9]*" 

所有目录都以数字开头。

我可以成功地使用它来执行第二次查找。该查找获取的文件排除了一些我不想处理的文件名:

find . -type d -regex "^./[0-9]*" -exec find {} -type f \( ! -iname '.*' ! -name 'async.log' \) \;

这一切都很好,returns 我需要处理的文件列表。

现在问题来了:

我真正想要的是使用 2nd find to -exec chmod 644。我找到了一种使用 xargs 来完成此操作的方法,它似乎工作正常。在这里的示例中,我使用 echo 只是为了验证返回的文件列表。

find . -type d -regex "^./[0-9]*" | xargs -I dirname find dirname -type f \( ! -iname '.*' ! -name 'async.log' \) -exec echo {} \;

但我想做的只是将 -exec 与我的链式查找命令一起使用,因为它比将结果通过管道传输到 xargs 快很多倍,但结果出了点问题:

find . -type d -regex "^./[0-9]*" -exec find {} -type f \( ! -iname '.*' ! -name 'async.log' \) \; -exec echo {} \;

当我将输出发送到文件时,出现了差异,嵌套的查找命令似乎在完全完成之前就停止了。

比较两个文件时,xargs 版本有 173125 行,而嵌套的 find 命令只有 173060 行。

查找版本中的最后一行显示截断:

./104/5734c420e70d8.pdf
./104  

我无法解释这个问题,也无法想出调试或解决问题的方法。关于如何使我的 find-only 解决方案起作用的任何想法?

我觉得如果只用一次find应该会更简单。

只要您要搜索的所有目录都在同一目录中,以下解决方案就可以使用。

find {0,1,2,3,4,5,6,7,8,9}* -type f \( ! -iname '.*' ! -name 'async.log' \) -exec chmod 644 {} \;

在当前目录中搜索所有以数字开头的目录,排除以点开头的文件,排除名为 async.log 的文件并将命令 chmod 644 应用于找到的文件。