Listar intervalo de arquivos com curingas do UNIX

14

Por exemplo, eu tenho os seguintes arquivos no meu diretório de trabalho: mjk0001.fits, mjk0002.fits, ... aumentando numericamente todo o caminho para mjk9999.fits.

Existe uma maneira de usar curingas do UNIX para listar ou operar em um grupo sequencial deles? Por exemplo, se eu precisar executar um processo de 0025 a 0050, que formato eu usaria?

Eu tentei o seguinte, mas não tive sucesso:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Obrigado antecipadamente a todos, MK

    
por Matt Keene 25.04.2013 / 22:15

4 respostas

18

Você pode usar a expansão de chaves:

ls mjk00{25..50}.fits

Zeros à esquerda podem ser incluídos, se necessário:

ls mjk0{000..149}.fits
    
por 25.04.2013 / 23:06
1

Não diretamente, mas você pode usar vários padrões glob:

ls mjk002[56789].fits mjk00[34]?.fits

Não é exatamente o que você está procurando, mas é a coisa mais próxima que os padrões globais oferecem, e é certamente melhor do que digitar cada sistema de arquivos. Pelo menos, o número de padrões que você precisará por intervalo numérico é limitado pelo log dos pontos finais numéricos do intervalo.

    
por 25.04.2013 / 22:27
1

Você poderia usar um regex com grep. Eu não sou um guru da regex. O seguinte retorna o padrão com os números entre 25 e 50:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

Eu não sei se é possível e como, eventualmente, generalizar isso com o grep.

    
por 25.04.2013 / 22:30
0

Pode ser possível obter maior portabilidade ou flexibilidade usando um for loop e printf :

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Isso lida bem com os espaços e os resultados são adequados para canalizar para xargs para processamento adicional.

Números com várias correspondências resultarão na listagem de todos os arquivos correspondentes.

Os números sem correspondência informarão um erro no stderr, mas o ||true suprime um retorno de erro do nível bash.

No caso básico, no entanto, usar for e printf não é diferente do mais conciso:

ls --escape mjk{0025..0050..1}* ||true
    
por 27.03.2017 / 22:26