grep -r 并在整个磁盘中搜索

grep -r 并在整个磁盘中搜索
grep -r xxx" /*
grep: /dev/log: No such device or address
grep: /dev/dvd: No medium found
grep: /dev/cdrw: No medium found
grep: /dev/cdrom: No medium found

但花了 2 个多小时才找到结果。如果我使用grep -r "xxx" /etc,就会得到结果。我如何在整个磁盘中搜索?

答案1

盲目使用grep -ron/不是一个好主意。几个目录(例如/dev/proc)包含不应以不受控制的方式访问的特殊文件 - 这样做可能会导致您的屏幕上充斥着错误,让您等到世界末日,甚至使系统崩溃。

你需要使用find以防止搜索进入这些目录并保留特殊文件:

  • 使用显式否定-path选项:

    find / -maxdepth 2 -type f ! -path '/proc/*' ! -path '/dev/*' -exec grep "xxx" {} +
    
  • 使用-prune选项:

    find / -maxdepth 2 -path '/proc' -prune -o -path '/dev' -prune -o -type f -exec grep "xxx" {} +
    
  • 使用该-xdev选项可以完全避免下降到其他文件系统:

    find / -maxdepth 2 -xdev -type f -exec grep "xxx" {} +
    

-type f只会让常规文件通过。您可以根据需要使用任意数量的-pathand/or-prune选项来微调 的输出find

还请注意,使用多个文件调用-exec ... +的变体,而不是为每个文件启动单独的进程。或者,您可以使用-execgrepgrepxargs致电grep

find / -maxdepth 2 -xdev -type f -print0 | xargs -r -0 grep "xxx"

这里这是我对相关问题的旧回答……

答案2

如果要搜索整个磁盘,请使用 find

find / -type f -exec grep "xxx" {} /dev/null \;

答案中的 /dev/null 允许 grep 打印匹配的文件名。

为了避免为每个文件运行新的 grep 进程,我编写了一个Perl 版本的 grep(pipegrep)从 stdin 读取文件名。你可以像这样运行它

find / -type f -print | pipegrep "string to find"

代码在这里:

#!/bin/perl

$pat = shift || die "I won't search for nothing";
while (<STDIN>) {
    chomp;
    if(-f $_ && open(IN, $_)) {
        @matches = grep(/$pat/, <IN>);
        close IN;
        for $match (@matches) {
           print $_, ": ", $match;
        }
    }
}

相关内容