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 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
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.
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.
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
Tags command-line bash ls unix