1
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 я получаю результаты. Как я могу искать на всем диске?

2 ответа2

3

Использование grep -r вслепую на / не очень хорошая идея. Несколько каталогов (например, /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 и / или -prune варианты , как вам нужно точно настроить вывод find

Также обратите внимание на использование -exec ... + варианта -exec который вызывает grep с несколькими файлами, вместо запуска отдельного процесса grep для каждого из них. В качестве альтернативы вы можете использовать xargs для вызова grep:

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

Вот мой старый ответ на связанный вопрос ...

0

Если вы хотите найти весь диск, используйте поиск

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;
        }
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .