Ich habe hier ein paar Multi Volumen Archive RAR-Dateien ohne korrekte Benennung.
Es scheint keine einfache Möglichkeit zu geben, diese korrekt zu benennen, rar selber kann aber die Nummer der Datei innerhalb des Archives ausgeben:
unrar vt dateixxx.rar
Im Text-Ende steht dann etwas von “Volume xxx”.
Wie aber erstelle ich mir daraus wieder die ‘richtigen’ Namen bzw. einen Namen über den ich das Archiv dann wieder richtig auspacken kann?
Das hier ist immerhin ein Anfang. Mal sehen, ob ich es noch besser hin bekomme.
for f in *.rar; do echo -n "mv $f "; unrar v "$f" | sed -n 12p | awk 'BEGIN {ORS=""}/volume /{printf "%-2s", $NF}'; echo - ".rar" ; done;
Gelistet wird jeweils der alte Dateiname plus die Information, welche Reihenfolge sie tatsächlich im Archiv hat.
Inzwischen habe ich eine erheblich verbesserte Version, die das erstellen eines Skripts für die Umbenennung in sich trägt:
for f in *; do echo -n "mv $f "; unrar v "$f" | tail -n2 | head -n1 | awk -F"volume" '{ print $2 }' | awk -F" " 'BEGIN {ORS=""}{printf("archive.part.%03d.rar\n", $1)}'; done;
Und noch eine Version, die jetzt versucht anhand der Dateigröße einen korrekten Namen zu bilden.
for f in *; do echo -n “mv $f “; unrar vt “$f” | awk -F”Size:” ‘{ print $2 }’ | sed ‘/^$/d’ | sort -b -g -r | head -n1| tr -d ‘ ‘ | awk -F” ” ‘BEGIN {ORS=””}{printf(“%s”, $1)}’; unrar v “$f” | tail -n2 | head -n1 | awk -F”volume” ‘{ print $2 }’ | awk -F” ” ‘BEGIN {ORS=””}{printf(“.part%03d.rar\n”, $1)}’; done | tee > rename.sh
das scheitert allerdings bei Archivdateien des gleichen Volumes, die mehr als eine Datei enthalten<, da dann für/del>
awk -F"Size:" '{ print $2 }'
Das stimmt jetzt auch nicht mehr. Die korrigierte Version verwendet jetzt eine kombination aus numerischem “sort” + “head” um die Größe der größten Datei des Archives als Dateinamen zu verwenden. Das hat in meinem Beispielen wunderbar funktioniert.
Hier eine neuere Variante, die innerhalb der erzeugten Datei nach Endungen sortiert:
for f in *; do echo -n "mv $f "; unrar vt "$f" | awk -F"Size:" '{ print $2 }' | sed '/^$/d' | sort -b -g -r | head -n1| tr -d ' ' | awk -F" " 'BEGIN {ORS=""}{printf("%s", $1)}'; unrar v "$f" | tail -n2 | head -n1 | awk -F"volume" '{ print $2 }' | awk -F" " 'BEGIN {ORS=""}{printf(".part%03d.rar\n", $1)}'; done | sort -k3 | tee > rename.sh 2>&1
Um die Schleife sicherer zu machen könnte man hier noch find einsetzen, damit kann man dann die Dateien auf eine Verzeichnis-Hierarchie und auf nur Dateien einschränken.
find ./ -type f -maxdepth 1 -name "*"|while read f; do echo "$f"; done