Dateibereich mit UNIX-Platzhaltern auflisten


14

Angenommen, ich habe die folgenden Dateien in meinem Arbeitsverzeichnis: mjk0001.fits, mjk0002.fits, ... numerisch bis mjk9999.fits.

Gibt es eine Möglichkeit, UNIX-Platzhalter zum Auflisten oder Bearbeiten einer sequenziellen Gruppe von UNIX-Platzhaltern zu verwenden? Welches Format würde ich beispielsweise verwenden, wenn ich einen Prozess zwischen 0025 und 0050 ausführen muss?

Ich habe Folgendes versucht, aber keinen Erfolg gehabt:

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

Vielen Dank im Voraus an alle, MK


Als Referenz: Pattern Matching , Globbing
Ignis

Antworten:


20

Sie können die Klammererweiterung verwenden:

ls mjk00{25..50}.fits

Bei Bedarf können führende Nullen eingefügt werden:

ls mjk0{000..149}.fits

1
Mit dieser Syntax können Sie auch einen Schritt Wert angeben: {25..50..2}.
Nobar

1

Nicht direkt, aber Sie können mehrere Glob-Muster verwenden:

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

Es ist nicht genau das, wonach Sie suchen, aber es ist das Nächste, was Glob-Muster bieten, und es ist sicherlich besser, als jedes Dateisystem zu tippen. Mindestens die Anzahl der Muster, die Sie pro Zahlenbereich benötigen, wird durch das Protokoll der numerischen Endpunkte des Bereichs begrenzt.


1

Sie könnten einen regulären Ausdruck mit grep verwenden. Ich bin kein Regex-Guru. Folgendes gibt das Muster mit den Zahlen zwischen 25 und 50 zurück:

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

Ich weiß nicht, ob es möglich ist und wie man das eventuell mit grep verallgemeinern kann.


0

Möglicherweise können Sie eine größere Portabilität oder Flexibilität erzielen, indem Sie eine forSchleife verwenden und printf:

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

Dies handhabt Räume gut und die Ergebnisse sind gut geeignet, um xargszur weiteren Verarbeitung weitergeleitet zu werden.

Zahlen mit mehreren Übereinstimmungen führen dazu, dass alle übereinstimmenden Dateien aufgelistet werden.

Zahlen ohne Übereinstimmungen melden einen Fehler bei stderr, ||trueunterdrücken jedoch eine Fehlerrückgabe auf Bash-Ebene.


Im Grundfall unterscheidet sich die Verwendung von forund printfjedoch nicht von der prägnanteren:

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

Wenn Sie die Ergebnisse der for i in {025..050} ; do ... ; done
Klammererweiterung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.