在整个文件系统中查找包含string的文件

我需要在整个文件系统中find给定string的所有实例,因为我不记得在哪个configuration文件,脚本或任何其他程序中,我需要用一个新的string更新该string。

我试着用下面的命令

`grep -nr'needle'/ –exclude-dir = .svn | mail [email protected] -s'xxx'的引用

如果我在一个小目录上运行这个命令,它会给出我需要的输出结果

/path1/:nn:line containing needle /path2/:nn:line containing needle 

其中/ path1是文件的完整path,nn是包含针的行,最后一个字段是该行的内容。

但是,当我在根目录上运行命令后,grep进程挂起一段时间。 我大约8小时前运行这个脚本,甚至在一个小文件系统上(小于5GB),它不会结束,如果我运行topps的过程似乎睡觉

root 24909 0.0 0.1 3772 1520 pts/1 S+ Feb10 0:15 grep -nr needle / --exclude-dir=.svn

为什么它不结束? 有没有更好的方法来做到这一点(这是一个单一的工作,我不需要执行一次以上)

谢谢。

更新:我发现一个工作的解决scheme与查找和xargs似乎工作,并使用较less的系统资源比查找-exec解决scheme。 这是我最后的命令行:

 find /{boot,etc,home,lib,lost+found,opt,root,sbin,usr,var} -type f -print0 | xargs -r0 grep -nr 'needle' | mail [email protected] -s 'References on xxx' 

我使用了/{dir1,dir2,...,dirn}语法,因为我需要包含前导斜杠的完整path的输出行,并且以这种方式可以在没有cd / ie的情况下使用该命令。

文件系统中有一些文件不是真实的文件,而是挂钩到内核中。 其中一些可以永远阅读。 尝试

 grep foo /dev/zero 

看到这在行动。 在接pipe整个系统之前,准备好用ctrl-C来停止它。

如果我想要做你正在做的事情,我会枚举/我想扫描的子目录,并确保我只检查文本文件,可能与

 cd / find boot etc home lib lost+found media mnt opt root sbin tmp usr var -type f -exec grep needle {} /dev/null \; 

注意列表不包含/dev/proc/sys/selinux

你可以尝试使用find + xargs + grep,

find /there -type f :MaybeSomeRestrictingFlagsLikeSizeNotBigger500MB_or_FS_type_if_u_know_its_exactly_on_EXT3_AndSoOn: -print0 | xargs -0r grep needle /dev/null

(即使只find一个文件,/ dev / null也会使grep打印文件名)

我不知道为什么它不会结束,但是“fgrep -R”通常在这些情况下起作用。

您可能想要从该命令中排除dev和proc。 我会用find查找,排除特殊文件:

 find . -type f -exec grep -H "My search string" '{}' \; -print 

正如其他人指出的,错误发生,因为您正在使用一些“文件”,将产生奇怪的结果的grep。 例如grep XXX / dev / zero将会永远持续下去。

我会首先排除你的search目录,如/ dev /和/ proc /。 另一种方法是只search“文件”,没有其他types。

另外,如果你在grep中的参数列表太长,你会得到这个错误:

 bash: /bin/grep: Argument list too long 

你可以用一个循环来解决这个问题,例如:

 for i in `find -type f /`; do grep -H "sample string" $i; done 

或者通过执行从查找,无论漂浮你的船。

 find / -type f -exec grep -H "sample string" '{}' \; -print 

这应该做一个查找,然后grep每个文件。 尽pipe有人指出,每次find文件的时候都会产生grep效率低下,但是你必须做一些“低效率”的事情,因为你必须从字面上search每个文件。