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