GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je créer un zip / tgz sous Linux de sorte que Windows ait les noms de fichiers appropriés ?

Actuellement, tar encode les noms de fichiers en UTF

En fait, tar n'encode/décode pas du tout les noms de fichiers, il les copie simplement hors du système de fichiers tels quels. Si vos paramètres régionaux sont basés sur UTF-8 (comme dans de nombreuses distributions Linux modernes), ce sera UTF-8. Malheureusement, la page de code système d'une boîte Windows n'est jamais UTF-8, donc les noms seront toujours mutilés, sauf sur des outils tels que WinRAR qui permettent de modifier le jeu de caractères utilisé.

Il est donc impossible de créer un fichier ZIP avec des noms de fichiers non ASCII qui fonctionnent dans les versions de Windows de différents pays et leur prise en charge intégrée des dossiers compressés.

C'est une lacune des formats tar et zip qu'il n'y a pas d'informations de codage fixes ou fournies, de sorte que les caractères non ASCII seront toujours non portables. Si vous avez besoin d'un format d'archive non ASCII, vous devrez utiliser l'un des formats les plus récents, tels que le récent 7z ou rar. Malheureusement, ceux-ci sont encore bancaux; dans 7zip, vous avez besoin du -mcu switch, et rar n'utilisera toujours pas UTF-8 à moins qu'il ne détecte des caractères qui ne se trouvent pas dans la page de code.

Fondamentalement, c'est un gâchis horrible et si vous pouvez éviter de distribuer des archives contenant des noms de fichiers avec des caractères non-ASCII, vous serez bien mieux lotis.


Voici un simple script Python que j'ai écrit pour décompresser les fichiers tar d'UNIX sous 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()

Le problème, en utilisant sous Linux le tar par défaut (GNU tar), est résolu... en ajoutant le --format=posix paramètre lors de la création du fichier.

Par exemple:
tar --format=posix -cf

Sous Windows, pour extraire les fichiers, j'utilise bsdtar.

Dans https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html il est écrit (depuis 2005 !!):

> J'ai lu quelque chose dans le ChangeLog sur le support de l'UTF-8. Que signifie
> ça veut dire ?
> Je n'ai trouvé aucun moyen de créer une archive qui serait interchangeable
> entre différents lieux.

Lors de la création d'archives au format POSIX.1-2001 (tar --format=posix ou--format=pax), tar convertit les noms de fichiers des paramètres régionaux actuels en UTF-8, puis les stocke dans l'archive. Lors de l'extraction, l'opération inverse est effectuée.

PS Au lieu de taper --format=posix vous pouvez taper -H pax , qui est plus court.


Linux
  1. Comment puis-je créer une arborescence de répertoires en C++/Linux ?

  2. Comment puis-je utiliser grep pour afficher uniquement les noms de fichiers sous Linux ?

  3. Comment créer une archive zip compatible Linux d'un répertoire sur un Mac

  4. Comment puis-je créer un fichier tar en plusieurs parties sous Linux ?

  5. Comment puis-je protéger par mot de passe un fichier .tgz avec tar sous Unix ?

6 fonctionnalités que Windows 10 a tirées de Linux

Comment installer les packages .tar.gz ou .tgz sous Linux

Comment exécuter Windows 95 sous Linux

Comment créer une clé USB bootable Windows 10 sous Linux

Comment créer un fichier zip ou des répertoires protégés par mot de passe sous Linux

Comment créer une clé USB amorçable Windows sous Linux