嗨,我在 HP-UX 服务器上。当以递归方式 grep 目录树时,如果目录树还包含二进制文件,我会遇到问题:grep 会将它们视为文本文件,并显示包含大量不可打印字符的很长的行。这不仅使输出难以扫描,而且经常使我的终端无法使用(并在其标题中写入奇怪的字符串)。
GNU-grep 有一个--binary-file=
可以提供帮助的选项(并且它不会为二进制文件打印匹配的行),但我没有可用的 GNU-tools。
有没有办法模拟 GNU-grep 的行为或忽略看起来像二进制的文件?
顺便说一句,如果在 perl 中有一种简单的方法可以做到这一点,那就太好了。
答案1
基于上一个答案,您可以使用“file”命令来识别文本文件,然后将 grep 限制为仅针对这些文件。例如:
find dir -type f -print |
xargs file |
grep text |
cut -f1 -d: |
xargs grep "expression"
那是:
- 查找目录“dir”中的所有文件
- 将这些作为参数传递给“文件”
- 查找包含单词“文本”的“文件”的输出
- 删除第一个冒号分隔的字段并将其用作文件名
- 使用 grep 搜索这些文件。
如果文件名包含空格或冒号,此操作将会失败,但是除此之外,它仍可执行您想要的操作。
答案2
可能有更好的方法,但也许将所有文件传递给 shell 循环,然后使用文件命令执行如下操作:
if file "$i" | grep text; then
...
fi
...?