grep parece ignorar --include

1

man grep diz

grep [OPTIONS] PATTERN [FILE...]

. . .

   --include=GLOB
          Search  only  files whose base name matches GLOB (using wildcard
          matching as described under --exclude).

Então eu digitei

grep --include="*.html" 'li' *

para procurar instâncias de li em arquivos HTML no diretório atual. Em vez disso, recebo uma lista de todos os usos de li em qualquer lugar do diretório, mesmo nos arquivos não-HTML. O que estou fazendo de errado? Eu tentei todos os tipos de variantes como

grep --include=\*.html 'li' *

mas sem sorte.

    
por Charles 22.12.2011 / 05:49

4 respostas

4

--include=PATTERN só funciona quando você adiciona -r

$ grep -r --include='*.html' 'li' .

-R, -r, --recursive   Read all files under each directory, recursively; this is equivalent to the -d recurse option.
--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.
    
por 22.12.2011 / 07:26
1

O shell que você está usando (bash, tsh, zsh, etc) ditará a globalização da linha de comando que irá e não funcionará. A maioria das pessoas usa o bash porque ele é instalado por padrão em muitas distros - eu uso o bash.

A seguinte sintaxe sempre funcionou para mim.

    grep -r --include=*.html li *
  1. Como mencionado acima, a opção -r permite que o grep pesquise subdiretórios, caso contrário não, o que faz com que pareça grep falhou.
  2. Inclusões simples de tipo de arquivo (uma extensão) não precisam de tweeking.
  3. Não cite (simples ou duplo) a inclusão, o analisador não gosta

Para inclusões de múltiplas extensões eu uso uma expansão de chave bash.

    grep -r --include=*.{html,htm,js} li *

Outras coisas para tentar se você ainda tiver problemas

  1. Escape o * para protegê-lo quando for analisado pelo shell

    grep -r --include=\*.html li *
    
  2. Tornar o caminho de pesquisa mais explícito

    grep -r --include=\*.html li ./*
    

Espero que ajude

    
por 24.01.2012 / 00:37
0

find $directoryname -maxdepth 1 -name '*.html' | xargs grep 'li' Aqui -maxdepth 1 é para procurar apenas no diretório e não em seus subdiretórios. Se você quiser pesquisar até mesmo no subdiretório, remova -maxdepth 1 no comando.

    
por 22.12.2011 / 07:39
0

grep -version não funciona, mas grep --version fornece

grep (GNU grep) 2.9

e a declaração de direitos autorais.

grep 'li' *.html

pega o shell para fazer o globbing, o que não é útil para mim desde que eu quero recorrer.

Eu tentei originalmente o comando com -R (ou -r ), mas isso também não funcionou. O comando recursing mas traz arquivos sem html no nome (ou em qualquer lugar no caminho). Então não é isso também.

Eu colocaria esses comentários ou editaria no original, mas, por algum motivo, o StackExchange não está associando minha conta corretamente. (Mods: por favor, comente-ify isso!)

    
por 22.12.2011 / 07:12

Tags