grep e diretórios contendo espaços

2

Eu gostaria de pesquisar todos os arquivos contendo uma associação de strings (aqui os arquivos devem conter 'arthur' AND ('déni' OR 'deni') por exemplo) em um diretório e subdiretórios. Depois de alguma pesquisa, eu criei o seguinte código:

egrep -li 'arthur' 'egrep -lir 'déni|deni' /path/to/files/'

o problema é que recebo mensagens de erro porque muitos arquivos e diretórios contêm espaços. Existe uma maneira de contornar essa questão?

    
por jejuba 15.03.2014 / 11:26

2 respostas

3

Seria melhor usar find e passar um comando shell para -exec :

find /path/to/files -type f -exec sh -c 'for file do
    egrep -iq "déni|deni" "$file" && egrep -li "arthur" "$file"
    done' sh {} +

Isso funcionaria com nomes de arquivos contendo espaços.

Dissecando o comando shell:

egrep -iq "déni|deni" "$file" && egrep -li "arthur" "$file"

Dizer que egrep -iq "déni|deni" "$file" retornaria true se o padrão corresponder. Então, ele executaria egrep -li "arthur" "$file" , o que listaria o arquivo se o comando this fosse compatível com o padrão especificado.

Na verdade, você nem precisa de um shell:

find /path/to/files -type f -exec egrep -iq "déni|deni" {} \; \
                            -exec egrep -li "arthur" {} \;

( -exec predicados com o ; terminator também podem ser usados como condições (com base no status de saída do comando executado)).

    
por 15.03.2014 / 11:36
5

Com o GNU grep, você pode usar a opção -Z para nulo separar os nomes dos arquivos antes de direcionar para xargs :

egrep -lirZ 'déni|deni' /path/to/files/ | xargs -0 egrep -li 'arthur'
    
por 15.03.2014 / 11:45