O grep pode ser usado para procurar arquivos com alguma string em seus nomes?

1

Entendo que grep só pode ser usado para pesquisar arquivos que contenham uma string em seu conteúdo.

Pode ser usado para pesquisar arquivos com uma string em seus nomes? Eu li a manpage, e não penso assim.

Além disso, grep é pronunciado como [gri: p] ou [grep] (na notação IPA)? Eu li como o primeiro.

    
por Tim 15.05.2014 / 14:43

7 respostas

10

Parece que você está procurando find :

find . -type f -name "*foo*"

procuraria nomes de arquivos contendo foo no nome no diretório atual e nos subdiretórios.

find . -maxdepth 1 -type f -name "*foo*"

procuraria nomes de arquivos contendo foo apenas no diretório atual.

    
por 15.05.2014 / 14:46
5

Use find para gerar uma lista de nomes de arquivos e, em seguida, grep para analisá-los:

find . | grep 'stack[oO0]verfl[oO0]w'

A menos que você tenha um sistema de arquivos no qual a lista de nomes de arquivos seja em si um arquivo, não vejo como o grep pode fazer isso sozinho.

    
por 15.05.2014 / 19:08
3

Apenas por diversão, você pode usar o grep para gerar os nomes dos arquivos (não vazios) no diretório atual e gerar outro grep para procurar aqueles que você deseja:

grep -l . * 2>/dev/null | grep 'your_pattern'

O 2>/dev/null é necessário porque grep irá reclamar se você pedir para procurar em um diretório sem fornecer a opção -r .

Caveat emptor : isto irá funcionar mal com arquivos que possuem novas linhas em seus nomes e irão ignorar arquivos de pontos (ocultos) e arquivos vazios. find é o caminho certo a seguir, aqui.

    
por 15.05.2014 / 16:48
2

Não sei se isso seria útil e não posso comentar ...

ls | grep [regexPattern]

exempli gratia : procure por arquivos que iniciam com a letra 'p':

ls | grep ^p

E pode ser misturado de diversas formas (com regex) para pesquisar o que você deseja encontrar. Lembro-me de que li um artigo que diz para não analisar a saída do ls, então tenha cuidado.

    
por 15.05.2014 / 15:22
2

Para responder à sua pergunta, não. O grep não pode pesquisar por meio dos nomes dos arquivos, ele só pode pesquisar por dados textuais conforme é apresentado a eles. Então você basicamente tem 2 opções com grep .

Você pode fazer com que ele pesquise por uma lista de arquivos que você apresenta, e grep abrirá cada um desses arquivos, procurando o padrão que você o instruiu a procurar, ou você pode alimenta um fluxo de dados via STDIN.

Em qualquer caso, grep não pode olhar para os "metadados" em torno da fonte de sua entrada (STDIN ou arquivos), apenas seu conteúdo.

    
por 15.05.2014 / 16:09
1

GNU grep tem uma opção para apenas --include nomes de arquivo específicos, mas você ainda precisa fornecer grep com um padrão para pesquisar. Por exemplo

grep -r --include '*.txt' PATTERN .

percorrerá recursivamente o diretório de trabalho atual e imprimirá as linhas correspondentes a PATTERN nos arquivos que terminem em .txt

    
por 15.05.2014 / 22:34
1

Você pode usar find com grep :

por exemplo:

┌─ oneofone@Oa [~/c/g/s/g/O/cleanml] (master|●4✚3)                                                                
└──➜ find -type f -name '*.go' -exec grep -n package '{}' +
./html/doc.go:1:package html
./html/element.go:1:package html
./scanner/tree.go:1:package scanner
./scanner/tokenizer.go:1:package scanner
./main.go:1:package main

Ou apenas grep : grep package **/*pat* *pat*

Ou você pode usar ack se estiver pesquisando código: ack package --type=go

    
por 15.05.2014 / 23:13