什么脚本允许我 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' {} +