Se você estiver usando o GNU grep 2.11 ou posterior, -r
será iniciado a partir do diretório atual se nenhum diretório for especificado:
grep -r --exclude-dir='.*' string
Seguindo os conselhos de esta pergunta, posso recursivamente grep para uma string string
dentro do conteúdo de um determinado diretório dir
como segue
grep -r --exclude-dir='.*' string dir
No entanto, quando eu aplico isso ao diretório atual, como
$ grep -r --exclude-dir='.*' string .
$
Não obtenho resultados, pois a opção --exclude-dir='.*'
omite o diretório atual como oculto, pois corresponde a '.*'
.
Uma solução alternativa é mudar para o diretório pai via cd ..
, em seguida, executar o comando no filho apropriado e, em seguida, cd
novamente nesse diretório de trabalho original. Deve haver um único comando que eu possa usar para fazer isso sem a mudança de diretórios.
O que é um único comando para o conteúdo do grep do diretório atual, omitindo o conteúdo de diretórios ocultos?
Se você estiver usando o GNU grep 2.11 ou posterior, -r
será iniciado a partir do diretório atual se nenhum diretório for especificado:
grep -r --exclude-dir='.*' string
No shell glob (também conhecido como padrões de nome de arquivo), .
não tem 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. Então use:
grep -r --exclude-dir='.?*' string .
Como bash
não terá grep
percorrer diretórios ocultos por padrão (ou seja, sem dotglob
ativado:
$ 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 arquivos ocultos:
$ grep --exclude=".*" -r foo *
file:foo
test/file:foo
Você também pode especificar o diretório atual usando $(pwd)
como:
grep -r --exclude-dir='.*' string "$(pwd)"
Para recursar dentro de um diretório único (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/*)
altere apenas dir
para .
(ponto) e você terá exatamente o que deseja:
$ grep -r "string" $(echo ./*)
Se o que é necessário não são arquivos ocultos em nenhum dos subdiretórios, use:
$ grep -r --exclude-dir='.*' "string"
Ou use o find:
find . -not -path '*/\.*' -type f -exec grep "string" {} \+
Tags grep