Ich versuche Dateien so zu verschieben:
...
DLG023-00-01-sprite.TextGrid.json
DLG023-00-01.prosody.json
DLG023-01-01-sprite.ogg
DLG023-00-02-sprite.TextGrid.json
DLG023-00-02.prosody.json
DLG023-01-02-sprite.ogg
...
DLG028-00-01-sprite.TextGrid.json
DLG028-00-01.prosody.json
DLG028-01-01-sprite.ogg
...
z. B. verschieben Sie die Datei nach dialogue023/
wenn es anfängt mit DLG023
; zu dialogue024/
wenn es anfängt mit DLG024
; und so weiter.
Alle Dateien und Verzeichnisse befinden sich auf derselben Ebene.
Mit anderen Worten, ich versuche, Befehle wie diese zu erzeugen:
mv DLG023-00-01-sprite.ogg dialogue023/
Wie kann ich die erste Zahl aus dem Dateinamen extrahieren?
Bisher habe ich das bekommen:
for i in DLG*-*-*-sprite.ogg; do echo "${i//[^0-9]}";done
Dies gibt jedoch alle Ziffern aus (z. B. 230001), wenn nur die erste (z. B. 23) gewünscht wird.
for num in $(seq -f '%03g' 1 999); do test -d dialogue${num}||mkdir dialogue${num}; mv -t dialogue${num} DLG${num}-*; done
gefolgt vonrmdir dialogue*
-- das-f '%03g'
Das bedeutet, dass alle Zahlen mindestens dreistellig mit Nullen aufgefüllt sind. Da 999 dreistellig passt, werden alle Zahlen in den Verzeichnisnamen dreistellig. Einfachrmdir
Wenn das Verzeichnis nicht leer ist, schlägt dies fehl. Klammer für unwichtige Fehlerausgabe vonmv
über nicht vorhandene Dateien.