我想递归搜索某个单词,比如 MyWord,但我想打印包含 MyWord 的所有文件的全部内容。我该怎么做?
事实证明,我特别关心二进制 sqlite 文件,既对它们进行 grep,又将结果读取为文本文件,而不是二进制文件。
答案1
您还可以find
使用grep
:
find . -type f -exec grep -wq 'MyWord' {} \; -exec cat {} >> /path/to/outfile \;
这将找到包含单词“MyWord” 递归地一旦找到第一个匹配项,就会将整个文件内容重定向到一个新文件。
答案2
我会用:
sudo grep -rIlZ --exclude=${HISTFILE##*/} --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'MyWord' | xargs -0 cat > MyOutputFile
sudo
如果未在系统目录中查找,则删除。- 更改(根目录)
'/'
到当前目录'.'
或特定目录,即'/home/me/stuff'
- 删除
mnt
以包含 下安装的 Windows 文件mnt
。 - 删除
lib
以包含 Linux 源文件 - 排除提高速度所需的目录。请参阅:在所有文件中查找字符串需要很长时间
--exclude=${HISTFILE##*/}
MyWord
如果您第二次运行该命令,或者之前在其他命令中使用过该搜索字符串,则需要执行此操作。这可以防止包含 5 千条历史记录行 ($HISTFILE)。-r
递归,I
跳过二进制文件,在每个文件名后输出一个零字节,lZ
而不是通常的换行符。 空(零字节)终止符是必需的perl -0
,sort -z
用于(打印出)文件内容。xargs
cat
> MyOutputFile
将输出发送到文件而不是屏幕。关闭此选项则输出到屏幕。
笔记:输出中缺少文件名,仅列出文件内容。
答案3
如果您的文件夹不是很大,请尝试:
grep -rz '.*MyWord.*' myfolder > output
如果需要的话添加-a