我需要修复大型 nfs 卷上目录子集中的大量文件的权限。
在构建解决方案时,我首先使用 find 来获取我想要的目录列表:
find . -type d -regex "^./[0-9]*"
目录均以数字开头。
我可以成功地使用它来执行第二次查找。该查找获取的文件排除了一些我不想处理的文件名:
find . -type d -regex "^./[0-9]*" -exec find {} -type f \( ! -iname '.*' ! -name 'async.log' \) \;
这一切都很好,并返回了我需要处理的文件列表。
现在解决问题:
我真正想要的是使用 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
应用于找到的文件。
关于linux - 是否可以在 Linux 中可靠地嵌套 find -exec 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44917223/