grep -r e pesquisando no disco inteiro

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

mas demora mais de 2 horas sem resultados. Se eu usar grep -r "xxx" /etc , obtenho resultados. Como posso pesquisar em disco inteiro?

    
por senzacionale 11.07.2012 / 22:52

2 respostas

2

Usar grep -r cegamente em / não é uma boa ideia. Vários diretórios (por exemplo, /dev e /proc ) contêm arquivos especiais que não devem ser acessados de maneira descontrolada - isso pode apenas sobrecarregar sua tela com erros, esperar até o fim do mundo ou até travar o sistema.

Você precisa usar find para impedir que a pesquisa desça para esses diretórios e deixe arquivos especiais sozinhos :

  • Use opções -path negadas explícitas:

    find / -maxdepth 2 -type f ! -path '/proc/*' ! -path '/dev/*' -exec grep "xxx" {} +
    
  • Use a opção -prune :

    find / -maxdepth 2 -path '/proc' -prune -o -path '/dev' -prune -o -type f -exec grep "xxx" {} +
    
  • Use a opção -xdev para evitar a descida para outros sistemas de arquivos completamente:

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

-type f só permite arquivos regulares. Você pode usar quantas opções -path e / ou -prune forem necessárias para ajustar a saída de find .

Observe também o uso da variação -exec ... + de -exec que chama grep com vários arquivos, em vez de lançar um processo grep separado para cada um deles. Alternativamente, você pode usar xargs para chamar grep :

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

Aqui é uma resposta minha mais antiga a uma questão relacionada ...

    
por 11.07.2012 / 23:10
0

Se você quiser pesquisar o disco inteiro, use find

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

O / dev / null na resposta permite que o grep imprima o nome do arquivo com a correspondência.

Para evitar a execução de um novo processo de grep para cada arquivo, eu escrevi uma Versão Perl do grep (pipegrep) que lê nomes de arquivos de stdin. Você executaria como

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

O código está aqui:

#!/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;
        }
    }
}
    
por 11.07.2012 / 23:04

Tags