我需要在整个文件系统中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),它不会结束,如果我运行top或ps的过程似乎睡觉
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每个文件。