![符合 POSIX 标准的递归 grep,对于无法访问的目录没有错误](https://linux22.com/image/70682/%E7%AC%A6%E5%90%88%20POSIX%20%E6%A0%87%E5%87%86%E7%9A%84%E9%80%92%E5%BD%92%20grep%EF%BC%8C%E5%AF%B9%E4%BA%8E%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E7%9A%84%E7%9B%AE%E5%BD%95%E6%B2%A1%E6%9C%89%E9%94%99%E8%AF%AF.png)
什么脚本允许我 grep 关键字并打印文件内容中包含关键字的文件名,例如所有子目录中的所有 .sas 文件中的“Carhart”?我尝试了类似以下的操作,但它不起作用:
(find . -name '*.sas' -prune -type f -exec grep 'Carhart' > /dev/tty) >& /dev/null
该脚本将满足两个条件
- 它在 Solaris on SPARC-Enterprise 上的 tcsh 上运行,已通过 POSIX 认证
- 它不会在我无权搜索和/或读取的目录上生成“权限被拒绝”行。 ( 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' {} +