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 -r
on/
不是一个好主意。几个目录(例如/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
只会让常规文件通过。您可以根据需要使用任意数量的-path
and/or-prune
选项来微调 的输出find
。
还请注意,使用多个文件调用-exec ... +
的变体,而不是为每个文件启动单独的进程。或者,您可以使用-exec
grep
grep
xargs
致电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;
}
}
}