GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu vytvořit zip / tgz v Linuxu tak, aby Windows měl správné názvy souborů?

V současné době tar kóduje názvy souborů v UTF

Ve skutečnosti tar nekóduje/dekóduje názvy souborů vůbec, pouze je zkopíruje ze souborového systému tak, jak jsou. Pokud je vaše národní prostředí založené na UTF-8 (jako v mnoha moderních linuxových distribucích), bude to UTF-8. Bohužel systémová kódová stránka boxu Windows není nikdy UTF-8, takže názvy budou vždy pozměněny, s výjimkou nástrojů, jako je WinRAR, které umožňují změnu znakové sady.

Je tedy nemožné vytvořit soubor ZIP s názvy souborů, které nejsou ASCII a které by fungovaly ve verzích systému Windows v různých zemích a jejich vestavěná podpora komprimovaných složek.

Nedostatkem formátů tar a zip je to, že neexistují žádné pevné nebo dodávané informace o kódování, takže znaky jiné než ASCII budou vždy nepřenosné. Pokud potřebujete archivní formát jiný než ASCII, budete muset použít některý z novějších formátů, například nedávný 7z nebo rar. Naneštěstí jsou tyto stále nemotorné; v 7zip potřebujete -mcu přepínač a rar stále nebude používat UTF-8, pokud nezjistí znaky, které nejsou v kódové stránce.

V podstatě je to hrozný nepořádek a pokud se můžete vyhnout distribuci archivů obsahujících názvy souborů s jinými znaky než ASCII, budete na tom mnohem lépe.


Zde je jednoduchý skript Pythonu, který jsem napsal pro rozbalení souborů tar z UNIXu ve Windows:

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()

Problém je v použití výchozího tar v Linuxu (GNU tar), je vyřešeno... přidáním --format=posix parametr při vytváření souboru.

Například:
tar --format=posix -cf

Ve Windows k extrahování souborů používám bsdtar.

V https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html je napsáno (od 2005 !!):

> Četl jsem něco v ChangeLog o podpoře UTF-8. Co dělá
> to znamená?
> Nenašel jsem způsob, jak vytvořit archiv, který by byl zaměnitelný
> mezi různými lokalitami.

Při vytváření archivů ve formátu POSIX.1-2001 (tar --format=posix nebo--format=pax) tar převede názvy souborů z aktuálních lokalit na UTF-8 a poté je uloží do archivu. Při extrakci se provede obrácená operace.

P.S. Místo psaní --format=posix můžete zadat -H pax , která je kratší.


Linux
  1. Jak mohu vytvořit strom adresářů v C++/Linux?

  2. Jak mohu použít grep k zobrazení pouze názvů souborů v Linuxu?

  3. Jak vytvořit archiv zip adresáře kompatibilní s Linuxem na počítači Mac

  1. Jak mohu vytvořit vícedílný soubor tar v Linuxu?

  2. Jak mohu nainstalovat Windows 7 bez dvd nebo usb na linux?

  3. Jak můžeme v Linuxu vytvořit více fiktivních rozhraní?

  1. Jak vytvořit soubor ZIP chráněný heslem v systému Linux

  2. Jak vytvořit spouštěcí USB flash disk pro Linux ve Windows

  3. (C/C++) Jak vygenerovat spustitelný soubor, který lze spustit na Windows i Linuxu?