Como recursivamente grep conteúdo do diretório atual, omitindo todos os diretórios ocultos?

3

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?

    
por mherzl 19.06.2017 / 23:37

5 respostas

3

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
    
por 19.06.2017 / 23:46
2

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 .
    
por 19.06.2017 / 23:47
2

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
    
por 19.06.2017 / 23:45
1

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

grep -r --exclude-dir='.*' string "$(pwd)"
    
por 19.06.2017 / 23:46
1

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" {} \+
    
por 20.06.2017 / 01:57

Tags