Listar arquivos com grep?

7

Eu tenho um diretório que contém os seguintes arquivos:

file1a file1ab file12A2 file1Ab file1ab

Eu quero listar todos os arquivos que começam com file1 e seguidos por duas letras no máximo!

A solução que propus é a seguinte:

ls | grep -i file1 [az] {2}

Mas isso não funciona!

Eu quero saber por quê? e como listar?

    
por Mahmoud Assyass 19.11.2015 / 12:24

3 respostas

9

Você não precisa de canalização, grep ou ls . Basta usar o globo ocular.

Em bash , usando extglob pattern (deve ser habilitado por padrão em sessões interativas, se não usar shopt -s extglob para defini-lo primeiro):

file1@(|?|??)

? corresponde a qualquer caractere único, @(||) seleciona qualquer um dos padrões separados por | .

Se você quisesse apenas combinar os caracteres entre a-z e A-Z , use a classe de caractere [:alpha:] , que denota todos os caracteres alfabéticos na localidade atual:

file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]])

Exemplo:

$ ls -1
file1
file112
file11a
file12A2
file1a
file1ab
file1Ab
file1as
file2
fileadb

$ ls -1 file1@(|[[:alpha:]]|[[:alpha:]][[:alpha:]]))
file1
file1a
file1ab
file1Ab
file1as

zsh suporta isso nativamente:

file1(|[[:alpha:]]|[[:alpha:]][[:alpha:]])

Estou respondendo a essa parte com muita relutância, a pedido do OP.

Qualquer leitor futuro, não analise ls , use globbing.

Usando ls e grep :

ls | grep -E '^file1[[:alpha:]]{,2}$'

Exemplo:

% ls | grep -E '^file1[[:alpha:]]{,2}$'
file1
file1a
file1ab
file1Ab
file1as
    
por heemayl 19.11.2015 / 12:41
3

O que você acha de encontrar?

find . -maxdepth 1 -regextype posix-egrep -iregex '\./file1[a-z]{,2}.*'
    
por A.B. 19.11.2015 / 12:56
3

find com -regex bandeira é mais apropriado para esse tipo de tarefa, especialmente porque é uma regra geral que saída de ls nunca deve ser analisada .

No entanto, você declarou que está procurando arquivos apenas em um diretório (não em subdiretórios) e que deseja especificamente ls e grep . A solução é

\ls | grep -E 'file1[a-z]{2,}' 

Considerando também que você está pesquisando no diretório atual, mas evitando parsing ls , aqui está outra solução

 for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done                                        
./file1ab
./file1abc

No meu diretório atual, tenho dois arquivos, file1ab e file1abc . Em ambos os casos, o resultado é o seguinte:

xieerqi:$ for file in * ; do echo "$file" | grep -E 'file1[a-z]{2,}' ;done                                        
./file1ab
./file1abc

xieerqi:$ \ls | grep -E 'file1[a-z]{2,}'                                                                            
file1ab
file1abc
    
por Sergiy Kolodyazhnyy 19.11.2015 / 15:24