O padrão de Grep inclui traços e restringe a uma extensão de nome de arquivo

3

Estou tentando usar o grep para encontrar alguns arquivos tex contendo o padrão ->- :

grep -R -- "->-" *.tex

Mas isso não funciona. Se eu fizer:

grep -R -- "->-"

em vez disso, funciona, mas é muito lento e me dá claramente não apenas arquivos tex, mas também corresponde a muitos outros arquivos (por exemplo, arquivos binários).

Qual seria o caminho mais rápido para fazer essa pesquisa?

    
por student 20.02.2015 / 16:31

4 respostas

6

O problema é que -R informa grep para pesquisar recursivamente todos os arquivos no diretório. Então, você não pode combiná-lo com um grupo específico de arquivos. Portanto, você pode usar find como sugerido por @KM. ou shell globbing:

$ shopt -s globstar
$ grep -- "->-" **/*.tex

O comando shopt ativa o recurso globstar do bash:

globstar
                  If set, the pattern ** used in a pathname expansion con‐
                  text will match all files and zero or  more  directories
                  and  subdirectories.  If the pattern is followed by a /,
                  only directories and subdirectories match.

Em seguida, você fornece **/*.tex como um padrão e isso corresponderá a todos os arquivos .tex no diretório atual e em todos os subdiretórios.

Se você estiver usando zsh , não há necessidade do shopt (que é um recurso bash), já que zsh pode fazer isso por padrão.

    
por 20.02.2015 / 16:45
6

Experimente find e grep , com -exec :

find path_to_tex_files_directory -name "*.tex" -exec grep -- "->-" {} \;

ou com xargs

find path_to_tex_files_directory -name "*.tex" | xargs grep -- "->-"
    
por 20.02.2015 / 16:38
3

Se o seu grep for compatível com 1 , você poderá usar a opção --include :

grep -R --include '*.tex' -- "->-"

ou

grep -R --include='*.tex' -- "->-"

1:
Disponível pelo menos no GNU grep :

--include=GLOB
        Search only files whose base name matches GLOB

e OSX grep :

--include
        If specified, only files matching the given filename pattern are searched.
    
por 20.02.2015 / 19:16
2

-R option stand for recursive, eu acho que você não tem dir no padrão * .tex.

talvez tente algo como:

find . -name \*.tex -exec grep -l -- "->-" {} \;
  • você pode largar a opção -l , se você não se importa com o nome do arquivo
  • se você quiser ver nome do arquivo e padrão:

    find . -name \*.tex -exec grep -l -- "->-" {} \; | xargs grep -- "->-"
    

    mas isso é um double grep, a solução @KM parece melhor ..

por 20.02.2015 / 16:41

Tags