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.Antworten:
Ich gehe davon aus, dass Sie OS X verwenden, welches das nicht hat
-t
Option inmv
. Dies wird schmerzhaft langsam, wenn das Skript Tausende von Dateien verarbeitet.Entferne das
echo
Vormkdir
undmv
wenn die Ausgabe zufriedenstellend ist.quelle
Sie können den Befehl mv folgendermaßen generieren:
Nun werden die Befehle folgendermaßen gedruckt:
Wenn es das ist, was Sie wollen, leiten Sie diese Ausgabe einfach weiter
bash
und es wird ausgeführt:quelle
Einzeilige Lösung mit
find
:find
Befehl suchenDLG*
Dateien aus diesem Verzeichnis.bash -c
Satz.In dem
bash
Satz:DEST=$(echo "$0" | sed -r "s/DLG([0-9]+)-.*/dialogue\1/");
wählt jedes Ergebnis von find ($0
) und verwendensed
Ersetzen Sie alle Zahlen vor der ersten-
(DLG ([0-9] +) -. *) Mitdialogue
mit diesen Nummern folgen (dialogue\1
) und in eine Variable namensDEST
.mkdir "$DEST"
erstellt den gewünschten Ordner.mv "$0" "$DEST"'
verschiebt die Datei in dieses Verzeichnis.quelle
Ein paar Ideen:
Wenn Sie sicher sind, dass sie alle gleich lang sind:
quelle