Encontre arquivos que contenham uma string em todo o sistema de arquivos

2

Eu preciso encontrar todas as instâncias de uma determinada string em todo o sistema de arquivos, porque não me lembro em quais arquivos de configuração, scripts ou outros programas eu coloquei e preciso atualizar essa string com uma nova.

Eu tentei com o seguinte comando

'grep -nr' needle '/ --exclude-dir = .svn | mail [email protected] -s 'Referências em xxx'

Se eu executar este comando em um diretório pequeno, ele me fornecerá a saída necessária no formulário

/path1/:nn:line containing needle
/path2/:nn:line containing needle

onde / path1 é o caminho completo do arquivo, nn é a linha que contém a agulha e o último campo é o conteúdo da linha.

No entanto, quando executo o comando no diretório-raiz, o processo do grep fica suspenso depois de um tempo. Eu corri este script cerca de 8 horas atrás e mesmo em um pequeno sistema de arquivos (menos de 5GB) ele não termina e se eu executar top ou ps o processo parece estar dormindo

root 24909 0.0 0.1 3772 1520 pts/1 S+ Feb10 0:15 grep -nr needle / --exclude-dir=.svn

Por que não acaba? Existe alguma maneira melhor de fazer isso (é um trabalho de uma só vez, eu não preciso executar isso mais de uma vez)

Obrigado.

Atualização: Eu encontrei uma solução de trabalho com find e xargs que parece estar funcionando e usa menos recursos do sistema do que a solução find -exec. Aqui está minha linha de comando final:

find /{boot,etc,home,lib,lost+found,opt,root,sbin,usr,var} -type f -print0 | xargs -r0 grep -nr 'needle' | mail [email protected] -s 'References on xxx'

Eu usei a sintaxe /{dir1,dir2,...,dirn} porque quero as linhas de saída com o caminho completo incluindo a barra inicial e, dessa forma, você pode usar o comando sem cd / , ou seja, de qualquer diretório.

    
por Fabio 11.02.2011 / 15:22

5 respostas

2

Existem alguns arquivos no sistema de arquivos que não são arquivos reais, mas que estão ligados ao kernel. Alguns desses podem ser lidos para sempre. Experimente

grep foo /dev/zero

para ver isso em ação. Prepare-se para pará-lo com ctrl-C antes de assumir todo o sistema.

Se eu quisesse fazer o que você está fazendo, eu enumeraria os subdiretórios de / que eu queria que fossem verificados, e verifique se eu só verifiquei os arquivos de texto, provavelmente com

cd /
find boot etc home lib lost+found media mnt opt root sbin tmp usr var -type f -exec grep needle {} /dev/null \;

Observe como a lista não contém /dev , /proc , /sys ou /selinux .

    
por 11.02.2011 / 15:30
2

Você pode tentar usar find + xargs + grep para isso, um pouco:

find /there -type f :MaybeSomeRestrictingFlagsLikeSizeNotBigger500MB_or_FS_type_if_u_know_its_exactly_on_EXT3_AndSoOn: -print0 | xargs -0r grep needle /dev/null

(/ dev / null faz o grep imprimir o nome do arquivo, mesmo que apenas um arquivo tenha sido encontrado)

    
por 11.02.2011 / 15:32
1

Eu não sei por que isso não termina, mas "fgrep -R" geralmente funciona nesses casos.

    
por 11.02.2011 / 15:27
0

Você pode querer excluir dev e proc desse comando. Eu faria isso com a localização e excluiria arquivos especiais:

find . -type f -exec grep -H "My search string" '{}' \; -print 
    
por 11.02.2011 / 15:30
0

Como alguns dos outros apontaram, o erro está ocorrendo porque você está usando o grep em alguns arquivos que produzirão resultados estranhos. Por exemplo, o grep XXX / dev / zero continuará para sempre.

Primeiramente eu excluiria os diretórios como / dev / e / proc / da sua pesquisa. Outra forma é procurar apenas por 'arquivos' e nenhum outro tipo.

Além disso, se a sua lista de argumentos no grep for muito longa, você receberá este erro:

bash: /bin/grep: Argument list too long

Você pode contornar isso com um loop, como este:

for i in 'find -type f /'; do grep -H "sample string" $i; done

Ou, executando-o a partir do find, o que for que flutua no seu barco.

find / -type f -exec grep -H "sample string" '{}' \; -print 

Isso deve fazer um achado e, em seguida, grep cada arquivo. Embora alguns tenham apontado que é ineficiente gerar spp cada vez que você encontrar um arquivo, você terá que fazer algo que será "ineficiente", porque você literalmente tem que procurar cada arquivo para aquela string.

    
por 11.02.2011 / 15:55

Tags