So benennen / extrahieren Sie Dateien mit langen Namen im Zip-Archiv

11

Ich habe eine Zip, die Dateien mit sehr langen Namen enthält.

Wenn ich versuche, in der Befehlszeile zu extrahieren, wird die Fehlermeldung "Dateiname zu lang" angezeigt.
Wenn ich den grafischen Archivmanager verwende, werden die Dateien nicht extrahiert und ich kann sie nicht umbenennen. Das gleiche Problem tritt auf, wenn ich das Archiv einbinde.

Ich kann Dateien einzeln extrahieren und umbenennen, indem ich:

unzip -p -c example.zip "long file name.ogg" > shortname.ogg

Dies ist bei vielen Dateien unpraktisch.

Gibt es ein Tool, mit dem Dateinamen beim Extrahieren abgeschnitten werden?

Terence Eden
quelle
Was ist die Ausgabe von unzip -l <ARCHIVE>und wie sollen die Namen abgeschnitten werden? Möchten Sie die Verzeichnisstruktur während des Extrahierens im Archiv beibehalten?
David Foerster

Antworten:

13

Extrahieren

Wir können zipinfoals Teil dieses Prozesses ein Programm aus dem zipPaket verwenden.

zipinfo -2 example.zip

zeigt nur die Dateinamen in example.zip, so sieht es aus:

file1-long-name-...-bla-bla.html
file2-long-name-...-bla-bla.html

Mit dieser Funktion können wir alle Dateien extrahieren:

zipinfo -2 example.zip | while read i;
do
  long_fname=${i%.*}
  unzip -p -c example.zip "$i" > "${long_fname:0:250}.${i##*.}"
done;
  • long_fname=${i%.*}: Entfernt die Erweiterung aus dem langen Dateinamen, sodass der Dateiname weniger als 256 Zeichen beträgt. Wir werden keine doppelte Erweiterung erhalten.
  • ${long_fname:0:250}.${i##*.}: Erstellt einen neuen Dateinamen mit einer legitimen Anzahl von Zeichen und fügt eine .echte Dateierweiterung hinzu .

Wir führen einfach eine Schleife in die Dateiliste und extrahieren jede mit einem neuen legitimen Dateinamen, der 256 Zeichen umfasst.


Umbenennen

Sie können den zipnoteBefehl verwenden, er ist auch Teil des zipPakets.

Holen Sie sich zuerst ein Backup Ihrer Zip-Datei.

Führen Sie diesen Befehl aus:

zipnote example.zip > names

Öffnen Sie Namen mit einem Editor. Sie sehen folgendermaßen aus:

@ file name long in zip and a lot of other strings in the file name
@ (comment above this line)
@ (zip file comment below this line)

Fügen Sie neue Dateinamen wie folgt hinzu:

@ file name long in zip and a lot of other strings in the file name
@=new short name for above file
@ (comment above this line)
@ (zip file comment below this line)

Um Dateien umzubenennen, verwenden Sie:

zipnote -w example.zip < names

Sie haben sie alle umbenannt. Sie können auch ein einfaches Skript schreiben, das dies automatisch für Sie erledigt.

Ravexina
quelle
Die sind unglaublich nützlich, danke! Ich konnte das Zipnote-Beispiel nicht zum Laufen bringen - und das erste entfernt die Dateierweiterung -, aber das ist gut genug für das, was ich tun muss. Vielen Dank!
Terence Eden
Ich habe die Antwort aktualisiert, jetzt wird sie auch die Erweiterung behalten;)
Ravexina
Sie sollten verwenden, IFS= read -r iwenn die Dateinamen mit Leerzeichen beginnen oder Dinge enthalten, die die Shell möglicherweise als Escape-Sequenzen interpretiert.
David Foerster