Elencare l'intervallo di file con i caratteri jolly UNIX


14

Ad esempio, ho i seguenti file nella mia directory di lavoro: mjk0001.fits, mjk0002.fits, ... aumentando numericamente fino a mjk9999.fits.

Esiste un modo per utilizzare i caratteri jolly UNIX per elencare o operare su un gruppo sequenziale di essi? Ad esempio, se devo eseguire un processo da 0025 a 0050, quale formato dovrei usare?

Ho provato quanto segue ma non ho avuto successo:

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

Grazie in anticipo a tutti, MK


Per riferimento: pattern matching , globbing
ignis

Risposte:


20

È possibile utilizzare l'espansione del controvento:

ls mjk00{25..50}.fits

Gli zeri iniziali possono essere inclusi se necessario:

ls mjk0{000..149}.fits

1
Utilizzando questa sintassi, è anche possibile specificare un valore di passo: {25..50..2}.
nobar

1

Non direttamente, ma è possibile utilizzare più modelli glob:

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

Non è esattamente quello che stai cercando, ma è la cosa più vicina che offrono i pattern glob, ed è sicuramente meglio che digitare ogni file system. Almeno il numero di modelli necessari per intervallo numerico è limitato dal registro degli endpoint numerici dell'intervallo.


1

Puoi usare una regex con grep. Non sono un guru regex. Quanto segue restituisce il modello con i numeri tra 25-50:

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

Non so se sia possibile e come alla fine generalizzarlo con grep.


0

Potrebbe essere possibile ottenere una maggiore portabilità o flessibilità utilizzando un forloop e printf:

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

Questo gestisce bene gli spazi e i risultati sono adatti per tubazioni xargsper ulteriori elaborazioni.

I numeri con più corrispondenze comporteranno l'elenco di tutti i file corrispondenti.

I numeri senza corrispondenze segnaleranno un errore su stderr, ma ||trueelimina un ritorno dell'errore di livello bash.


Nel caso di base, tuttavia, l'utilizzo di fore printfnon è diverso dal più conciso:

ls --escape mjk{0025..0050..1}* ||true

Se vuoi separare i risultati dell'espansione del controvento, puoi usare un ciclo for:for i in {025..050} ; do ... ; done
nobar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.