Como posso dizer ao grep para pesquisar em arquivo que tenho permissão?

1

Quando eu chamo

cd /
grep -r "some_str" .

vejo muitos arquivos impressos na tela e no final da linha vejo ": permissão negada". Como posso dizer ao bash para pesquisar somente em arquivo que tenho permissão. Isto será obviamente mais rápido que o padrão grep.

    
por Narek 18.03.2011 / 09:20

4 respostas

10

Use find / -readable -print0 | xargs -0 grep -H "some_str" em vez de grep -r . (Requer GNU find , mas grep -r é GNUish então suspeito que não seja um problema).

Mas na verdade não é tão "óbvio" que seja mais rápido; grep -r permite que a chamada open() descubra que você não pode lê-la, enquanto a versão find precisa stat() , então grep a open() - e a parte mais cara disso, para arquivos que não são legíveis, é o kernel que converte nomes de caminho em nós de índice do sistema de arquivos. (Na verdade, pesquisar arquivos legíveis será a maior parte do tempo de execução, para arquivos de tamanho significativo.) A abordagem mais rápida é apenas acrescentar 2>/dev/null ao grep -r , para que não haja perda de tempo na impressão de mensagens de erro. para retardar terminais.

    
por 18.03.2011 / 09:25
3

Você pode usar grep -s para ignorar mensagens sobre arquivos ilegíveis.

Imprimir as mensagens de erro é a única coisa que poderia causar lentidão, não é como se o grep lesse o arquivo inteiro e, em seguida, descartasse todos os resultados, porque na verdade ele não tinha o direito de lê-lo.

    
por 18.03.2011 / 13:13
1

Você pode tentar encontrar:

find / -perm o=r -or -user <user> -exec grep whatever '{}' \;

Além disso, este comando não irá procurar em arquivos, aos quais você tem permissão via grupo.

UPDATE : encontra-se disponível, como sugerido por outra resposta.

    
por 18.03.2011 / 09:29
0

Aqui está uma maneira divertida de fazer isso com Paralelo GNU , supondo que seu find (1) não suporte o sinalizador -readable :

find / -type f 2>/dev/null | parallel -m "grep blah {}"

A opção -m para paralelo faz com que ele inclua o maior número de arquivos possível em cada chamada do grep, o que é mais eficiente do que apenas um arquivo por vez.

Eu percebo que um problema com isso é que ele descartará outros erros de find além dos problemas de permissões. Eu suspeito que pode haver uma maneira de contornar isso com a opção de busca -depth , mas eu ainda não explorei isso.

Seria interessante comparar as abordagens find / grep vs. grep -r vs. parallel em um sistema multicore e ver qual é o mais rápido.

    
por 18.03.2011 / 22:32