继我发布的查询之后 - 将 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
选项使模式与隐藏名称相匹配。
在zsh
shell 中,这可以缩短为
for pathname in ./**/*FW*(.ND); do
if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
then
chmod 777 $pathname
fi
done
...其中.
,N
和D
依次对应于-f
测试(但不会匹配符号链接)、设置nullglob
和dotglob
设置bash
。