Como posso procurar por um arquivo com tamanho de nome fixo usando ls?

5

Em um diretório, tenho arquivos como

lazer_100506
lazer_100707
lazer_091211
lazer_110103
lazer_100406_temp
lazer_100622#delete

etc

Como posso obter uma listagem apenas dos quatro primeiros arquivos?

$ ls lazer_......
ls: lazer_......: No such file or directory
$ 
    
por Lazer 08.01.2011 / 18:07

4 respostas

7

Existem vários métodos:

ls apenas

ls lazer_??????

ls e egrep

ls | egrep '^lazer_.{6}$'

find

find . -regextype posix-egrep -regex '^./lazer_.{6}$'
    
por 08.01.2011 / 18:26
2

Como apontado por SiegeX , a Shell sozinha não entende expressões regulares . Se você quiser um filtro preciso de seus arquivos, você deve usar expressões regulares e, portanto, usar um comando como egrep .

Aqui, os arquivos que você deseja listar começam com lazer_ e são seguidos apenas por alguns dígitos (possivelmente mais ou menos que 6). Eu faria assim:

ls | egrep '^lazer_[[:digit:]]*$'

Esse regex funciona da mesma forma que '^lazer_[0-9]*$' .

Expressões regulares com egrep também lidam com a repetição como na resposta de wag , se você quiser restrinja sua lista a arquivos que terminem com exatamente 6 dígitos:

ls | egrep '^lazer_[[:digit:]]{6}$'
    
por 09.01.2011 / 12:10
2

Com zsh você pode usar um glob como ?(#cN) (aqui o c sinalizador exige que o ? anterior corresponda exatamente a N times):

setopt extendedglob
print -rl -- ?(#c12)

se você preferir ls :

ls -d -- ?(#c12)

Você também pode adicionar qualificadores, por exemplo, pesquisar recursivamente por arquivos regulares com tamanho de nome fixo:

print -rl -- **/?(#c12)(.)
    
por 11.08.2015 / 22:57
2

com ksh93 :

printf '%s\n' {12}(?)

para arquivos (não ocultos) cujo nome é composto de 12 caracteres.

Ou se você preferir expressões regulares:

printf '%s\n' ~(E)^.{12}$
    
por 12.08.2015 / 00:01