![搜索所有包含文本的文件](https://linux22.com/image/1311263/%E6%90%9C%E7%B4%A2%E6%89%80%E6%9C%89%E5%8C%85%E5%90%AB%E6%96%87%E6%9C%AC%E7%9A%84%E6%96%87%E4%BB%B6.png)
使用 Busybox,如何通过一堆目录递归地在一堆文件中搜索表达式,但只能查看文本文件?
我们不知道文件的后缀是什么;可能是 .sh,也可能什么都没有,也可能是其他的。我考虑以某种方式根据编码进行搜索,尽管我也不太确定编码是什么。
我试过了busybox grep -r
但是它也会搜索二进制文件,这浪费了很多时间。
答案1
grep
--binary-files
支持将二进制文件视为binary
或text
的选项without-match
。最后一个选项应该跳过二进制文件。它相当于grep -I
。我做了一个测试,似乎 Busyboxgrep
支持-I
跳过二进制文件。
grep
在确定文件是二进制还是文本方面并不是“神奇的”:它只是检查前几个字节以查看它们是否是文本,并假设文件的其余部分也是相同的(根据man grep
)。
旁注:可以通过比较head -1 myfile
文件是否等于来模拟这一点head -1 myfile | strings
。如果file
可用,则依赖性更强,但它不在 Busybox 中,并且如果主要使用 Busybox,则很可能不在系统上。
答案2
二进制文件与结构体有什么区别
struct MyBin
{
byte a;
byte b;
byte c;
}
与价值观
myBin.a = 70;
myBin.b = 111;
myBin.c = 111;
还有一个包含文本的文本文件Foo
?
文本文件是一种二进制文件,您可以使用称为字符编码(ASCII、UTF-8 等)的特殊查找代码对其进行解释。因此,没有简单的方法可以将“二进制文件”与“文本文件”区分开来。
可能有一种方法可以排除设置了执行位的文件,或者仅搜索文件大小以下的文件(我怀疑您的文本文件是否超过 1 MB),但我对如何过滤 grep 结果没有足够的了解,无法举例说明如何执行此操作。