GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich unter Linux ein zip / tgz erstellen, sodass Windows die richtigen Dateinamen hat?

Derzeit kodiert tar Dateinamen in UTF

Tatsächlich codiert/decodiert tar überhaupt keine Dateinamen, sondern kopiert sie einfach unverändert aus dem Dateisystem. Wenn Ihr Gebietsschema UTF-8-basiert ist (wie in vielen modernen Linux-Distributionen), ist das UTF-8. Leider ist die System-Codepage einer Windows-Box niemals UTF-8, daher werden die Namen immer verstümmelt, außer bei Tools wie WinRAR, die es ermöglichen, den verwendeten Zeichensatz zu ändern.

Daher ist es unmöglich, eine ZIP-Datei mit Nicht-ASCII-Dateinamen zu erstellen, die in den Windows-Versionen verschiedener Länder und deren integrierter Unterstützung für komprimierte Ordner funktionieren.

Es ist ein Mangel der tar- und zip-Formate, dass es keine festen oder bereitgestellten Codierungsinformationen gibt, sodass Nicht-ASCII-Zeichen immer nicht portierbar sind. Wenn Sie ein Nicht-ASCII-Archivformat benötigen, müssen Sie eines der neueren Formate verwenden, z. B. die neuesten 7z oder rar. Leider sind diese immer noch wackelig; in 7zip benötigen Sie den -mcu wechseln, und rar verwendet immer noch nicht UTF-8, es sei denn, es erkennt Zeichen, die nicht in der Codepage enthalten sind.

Im Grunde ist es ein schreckliches Durcheinander, und wenn Sie es vermeiden können, Archive zu verteilen, die Dateinamen mit Nicht-ASCII-Zeichen enthalten, sind Sie viel besser dran.


Hier ist ein einfaches Python-Skript, das ich geschrieben habe, um Tar-Dateien von UNIX unter Windows zu entpacken:

import tarfile

archive_name = "archive_name.tar"

def recover(name):
    return unicode(name, 'utf-8')

tar = tarfile.open(name=archive_name, mode='r', bufsize=16*1024)
updated = []
for m in tar.getmembers():
    m.name = recover(m.name)
    updated.append(m)

tar.extractall(members=updated)
tar.close()

Das Problem, unter Linux den Standard tar zu verwenden (GNU tar), ist gelöst... Hinzufügen des --format=posix Parameter beim Erstellen der Datei.

Zum Beispiel:
tar --format=posix -cf

Unter Windows verwende ich zum Extrahieren der Dateien bsdtar.

In https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html steht geschrieben (seit 2005 !!):

> Ich habe im ChangeLog etwas darüber gelesen, dass UTF-8 unterstützt wird. Was macht
> das heißt?
> Ich habe keine Möglichkeit gefunden, ein Archiv zu erstellen, das austauschbar wäre
> zwischen verschiedenen Orten.

Beim Erstellen von Archiven im POSIX.1-2001-Format (tar --format=posix oder --format=pax) konvertiert tar Dateinamen von den aktuellen Locales in UTF-8 und speichert sie dann im Archiv. Beim Extrahieren wird der umgekehrte Vorgang ausgeführt.

P.S. Anstatt --format=posix einzugeben Sie können -H pax eingeben , was kürzer ist.


Linux
  1. So erstellen Sie eine passwortgeschützte ZIP-Datei unter Linux

  2. Wie kann ich einen Verzeichnisbaum in C++/Linux erstellen?

  3. Wie kann ich grep verwenden, um nur Dateinamen unter Linux anzuzeigen?

  4. So erstellen Sie ein Linux-kompatibles Zip-Archiv eines Verzeichnisses auf einem Mac

  5. Wie kann ich Windows 7 ohne DVD oder USB unter Linux installieren?

6 Funktionen, die Windows 10 von Linux übernommen hat

So installieren Sie .tar.gz- oder .tgz-Pakete unter Linux

So führen Sie Windows 95 unter Linux aus

So erstellen Sie einen bootfähigen Windows 10-USB-Stick unter Linux

So erstellen Sie eine passwortgeschützte Zip-Datei oder Verzeichnisse in Linux

So erstellen Sie einen Windows-bootfähigen USB-Stick unter Linux