find 命令的管道输出

find 命令的管道输出

继我发布的查询之后 - 将 find 与 sh - 命令一起使用不起作用

根据以下命令的 o/p,我需要将列出的每个文件的权限更新为 777。

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

有什么方法可以将输出传输到文件chmod并更新文件权限吗?

答案1

您可以添加另一个-exec来对文件find执行。如果不需要,chmod请删除:-ls

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
  -ls -exec chmod 777 {} +

答案2

您可以-exec在末尾添加另一个来更新通过前面测试的文件的权限,就像弗莱迪的表演,或者您可以将grep和组合chmod在内联脚本中sh -c

find . -type f -name '*FW*' -exec sh -c '
    for pathname do
        if grep -q -i -e "chmod.*archive" -e "archive.*chmod" "$pathname"
        then
            chmod 777 "$pathname"
        fi
    done' sh {} +

这将用作脚本find中循环的路径名生成器sh -c

此循环获取赋予内联脚本的所有路径名,使用 测试每个路径名grep,如果模式在文件中匹配,则该文件的权限(可能)会更新。


在 中,您可以使用文件名通配模式,bash而不是通过 生成路径名:find

shopt -s globstar nullglob dotglob

for pathname in ./**/*FW*; do
    if [ -f "$pathname" ] && grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' "$pathname"
    then
        chmod 777 "$pathname"
    fi
done

这里唯一可见的区别是,这还将处理与模式匹配的符号链接。

shellglobstar选项启用**递归匹配子目录的模式。 shellnullglob选项使不匹配的模式消失,而不是保持未展开状态。 shelldotglob选项使模式与隐藏名称相匹配。

zshshell 中,这可以缩短为

for pathname in ./**/*FW*(.ND); do
    if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
    then
        chmod 777 $pathname
    fi
done

...其中.,ND依次对应于-f测试(但不会匹配符号链接)、设置nullglobdotglob设置bash

相关内容