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
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 comgrep -r foo *
é que o shell glob*
não ' t expandir para incluir diretórios / arquivos ocultos, a menos quedotglob
tenha sido definido comshopt -s dotglob
. Tente comgrep -r foo .
e você ' veremos que os diretórios ocultos são percorridos por grep. Ou tente comshopt -s dotglob
e depoisgrep -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
- Cite sua substituição de comando:
"$(pwd)"
Veja também Por que meu script de shell bloqueia com espaços em branco ou outros caracteres especiais?
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" {} \+
grep
, ele produz:grep: warning: recursive search of stdin