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

时间:2017-07-05 04:48:24

标签: linux bash find xargs

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

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

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

所有目录都以数字开头。

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

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

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

现在问题是:

我真正想要的是使用第二次查找到-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 {} \;

当我将输出发送到文件时,存在差异,并且嵌套的find命令似乎在完全完成之前停止。

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

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

./104/5734c420e70d8.pdf
./104  

我无法解释这一点,或想出一种调试或解决问题的方法。关于如何让我的查找解决方案有效的任何想法?

1 个答案:

答案 0 :(得分:1)

如果您只使用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应用于找到的文件。