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

标签 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' \) \;

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

现在解决问题:

我真正想要的是使用 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/

相关文章:

linux - 如何从 swagger 文档生成静态 html 文件?

linux - bash:递归地将父目录中的所有匹配文件移动到新的子目录

具有固定开始和重复 block 的字符串的Java正则表达式

excel - 在Excel中使用查找方法

javascript - JQuery AJax 获取页面片段查找与过滤

c - 将视频文件的每一帧映射到指向原始帧的 .png

c - 显示目录中的文件

linux - 编写 bash 脚本来更改文本并写入日志

bash - 按行拆分文件并将第一个字符串保留为输出文件的标题

bash - grep 获取 csv 文件的值