Como pesquisar texto em todo o sistema de arquivos?

47

Supondo que a ferramenta grep deva ser usada, eu gostaria de procurar pela string de texto "800x600" em todo o sistema de arquivos.

Eu tentei:

grep -r 800x600 /

mas não funciona.

O que eu acredito que meu comando deve fazer é grep recursivamente através de todos os arquivos / pastas em root para o texto "800x600" e listar os resultados da pesquisa.

O que estou fazendo de errado?

    
por Level1Coder 06.07.2011 / 09:32

5 respostas

60

Eu normalmente uso esse estilo de comando para executar grep em vários arquivos:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

O que isso realmente faz é fazer uma lista de todos os arquivos no sistema, e então, para cada arquivo, executar grep com os argumentos dados e o nome de cada arquivo.

O argumento -xdev informa que ele deve ignorar outros sistemas de arquivos - isso é bom para evitar sistemas de arquivos especiais como /proc . No entanto, ele também irá ignorar os sistemas de arquivos normais - portanto, se, por exemplo, sua pasta / home estiver em uma partição diferente, ela não será pesquisada - você precisará informar find / /home -xdev ... .

-type f significa procurar apenas por arquivos, portanto, diretórios, dispositivos e outros arquivos especiais são ignorados (ele ainda vai recorrer a diretórios e executar grep nos arquivos dentro - ele não executará grep no próprio diretório, que não funcionaria de qualquer maneira). E a opção -H para grep diz para sempre imprimir o nome do arquivo em sua saída.

find aceita todos os tipos de opções para filtrar a lista de arquivos. Por exemplo, -name '*.txt' processa apenas arquivos terminados em .txt. -size -2M significa arquivos menores que 2 megabytes. -mtime -5 significa arquivos modificados nos últimos cinco dias. Junte-os junto com -a para e e -o para ou , e use '(' parênteses ')' para agrupar expressões (entre aspas para evitar que o shell as interprete ). Então, por exemplo:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

Dê uma olhada em man find para ver a lista completa de possíveis filtros.

    
por 06.07.2011 / 10:24
13

Normalmente, você não deseja realmente pesquisar TUDO no sistema. O Linux usa nós de arquivo para tudo, então alguns "arquivos" não são coisas que você gostaria de pesquisar. Por exemplo, /dev/sda é o dispositivo de bloco físico para o seu primeiro disco rígido. Você provavelmente deseja pesquisar os sistemas de arquivos montados e não o dispositivo de disco bruto. Também existe /dev/random , que distribui dados aleatórios toda vez que você os lê. Pesquisando isso não faz muito sentido. O sistema de arquivos /proc também é problemático no seu caso.

Eu recomendaria uma de duas coisas.

  1. Não pesquise na raiz, pesquise apenas os locais que possam ser úteis. Pesquise /home ou /usr ou /etc separadamente. A informação que você está procurando é provavelmente de um tipo específico, então é provável que esteja em uma pasta específica de qualquer maneira. As definições de configuração devem estar em /etc . Seus arquivos de dados pessoais devem estar em /home . Limitar a pesquisa a uma área principal como essa reduzirá bastante seus problemas com greps recursivos.

  2. Exclua áreas problemáticas usando --exclude-dir e um conjunto de coisas que você sabe que não precisa disso:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

Por último, não é incomum se deparar com alguns erros de 'permissão negada' ao fazer um grande grep recursivo. No curso normal de uso, há arquivos que seu usuário pode não conseguir ler. Enquanto estes são apenas alguns arquivos estranhos e não coisas como o dispositivo bruto para seus discos rígidos ou todo o sistema de arquivos proc, é ok apenas ignorar os erros. Na verdade, você pode fazer isso na linha de comando enviando todos os erros para nunca aterrissar:

grep -r search_string /path 2> /dev/null
    
por 06.07.2011 / 11:01
2

Para simplificar, sugiro ack-grep . O link mostra muitos casos em que ack-grep é a melhor opção.

Para usar, após a instalação:

ack-grep pattern /
    
por 06.07.2011 / 17:09
1

Outra maneira de ver é assim:

grep -r /* | grep "800x600"
    
por 14.08.2017 / 15:07
-3

simplesmente certo -

grep -r "800x600" /

- O que está errado no seu comando atual são as aspas "" ". Sempre coloque o argumento string em grep entre aspas.

    
por 01.07.2015 / 14:49