Seguindo o conselho esta questão, posso executar grep recursivamente em uma string string no conteúdo de um determinado diretório dir da seguinte forma

grep -r --exclude-dir=".*" string dir 

No entanto, quando aplico isso ao diretório atual, como

$ grep -r --exclude-dir=".*" string . $ 

Não obtenho resultados, uma vez que --exclude-dir=".*" opção omite o diretório atual como oculto, pois corresponde a ".*".

Uma solução alternativa é mudar para o diretório pai via cd .., execute o comando no filho apropriado e cd novamente para o diretório de trabalho original. Deve haver um único comando que eu possa usar para fazer isso sem contornar a alteração de diretórios.

O que é um comando único para fazer o grep de conteúdo do diretório atual, omitindo o conteúdo dos diretórios ocultos?

Resposta

Se você estiver usando GNU grep 2.11 ou posterior, -r iniciará a partir do diretório atual se nenhum diretório for especificado:

grep -r --exclude-dir=".*" string 

Comentários

  • Bom em incluir a nota de versão. Com BSD grep, ele produz: grep: warning: recursive search of stdin

Resposta

No shell glob (também conhecido como padrões de nome de arquivo), . não tem nenhum significado especial, * significa zero ou mais caracteres e ? significa qualquer caractere único.

O que você deseja excluir é um ponto seguido por pelo menos um caractere e, em seguida, qualquer número de caracteres. Portanto, use:

grep -r --exclude-dir=".?*" string . 

Resposta

Desde bash não terá grep percorrendo diretórios ocultos por padrão (ou seja, sem dotglob habilitado:

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

Apenas exclua os arquivos ocultos:

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

Comentários

  • Estou curioso para saber o raciocínio por trás do voto negativo não comentado.
  • Não ' t voto negativo, mas ' não é verdade que grep não ' t atravessa diretórios ocultos. O que você ' o que vejo com grep -r foo * é que o shell glob * não ' t expandir para incluir diretórios / arquivos ocultos, a menos que dotglob tenha sido definido com shopt -s dotglob. Tente com grep -r foo . e você ' veremos que os diretórios ocultos são percorridos por grep. Ou tente com shopt -s dotglob e depois grep -r foo *.
  • Ponto justo; Esclareço isso em minha resposta.
  • Isso ainda pesquisará arquivos em diretórios ocultos contidos nos argumentos da linha de comando. Vai meio que funcionar. Na maioria dos casos, pode estar tudo bem, mas ' é como definir " pi " como " 3,1416 "; você conhece melhor as advertências.

Resposta

Você também pode especificar o diretório atual usando $(pwd) like:

grep -r --exclude-dir=".*" string "$(pwd)" 

Comentários

Resposta

Para recursar dentro de um único diretório (não limitando os arquivos ocultos dos subdiretórios) use:

Como echo dir/* imprimirá todos os arquivos dentro do diretório, isso funcionará para arquivos dentro de algum diretório:

$ grep -r "string" $(echo dir/*) 

basta alterar dir para . (ponto) e você obterá exatamente o que deseja:

$ grep -r "string" $(echo ./*) 

Se não for necessário nenhum arquivo oculto em nenhum dos subdiretórios, use:

$ grep -r --exclude-dir=".*" "string" 

Ou use find:

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *