符合 POSIX 标准的递归 grep,对于无法访问的目录没有错误

符合 POSIX 标准的递归 grep,对于无法访问的目录没有错误

什么脚本允许我 grep 关键字并打印文件内容中包含关键字的文件名,例如所有子目录中的所有 .sas 文件中的“Carhart”?我尝试了类似以下的操作,但它不起作用:

(find . -name '*.sas' -prune -type f -exec grep 'Carhart' > /dev/tty) >& /dev/null

该脚本将满足两个条件

  1. 它在 Solaris on SPARC-Enterprise 上的 tcsh 上运行,已通过 POSIX 认证
  2. 它不会在我无权搜索和/或读取的目录上生成“权限被拒绝”行。 ( find / -name '*.sas' -prune > /dev/tty ) > & /dev/null

由于 ( find / -name '*.sas' -prune > /dev/tty ) > & /dev/null工作时不会报告权限被拒绝错误,我如何修改这个简单的行以合并 grep?

答案1

要使 grep 仅打印文件名,请传递该-l选项。要搜索子字符串而不是正则表达式,请传递该-F选项。

要递归搜索名称与特定模式匹配的文件,请find-type f和一起使用。用于调用 grep。-name PATTERN-exec

find . -name '*.sas' -type f -exec grep -F -l 'Carhart' {} +

如果你想避免来自不允许遍历的目录的错误,你可以使用-perm,-user-group来分析权限(这很难正确,并且如果你有 ACL 将不起作用),或者调用test(这是速度较慢,因为它是外部程序,但更可靠)。

find . -type d ! -exec test -r {} -a -x {} \; -prune -o \
       -name '*.sas' -type f -exec test -r {} \; -exec grep -F -l 'Carhart' {} +

相关内容