Comment créer un fichier zip compatible avec Windows sous Linux

49

Je dois mettre un fichier zip à la disposition de tous les visiteurs de mes utilisateurs Windows. J'ai donc créé naïvement un fichier zip avec la commande zip Unix (appelons-le madeinlinux.zip).

Il s’ouvre correctement avec WinRar ou Winzip, mais ceux de mes utilisateurs qui utilisent le traitement de fichiers zip Windows standard rencontrent des problèmes lorsqu’ils essaient de le décompresser. (Windows XP)

J'ai compressé les mêmes données à l'aide du mécanisme zip intégré à Windows et, du point de vue de Linux, je ne vois aucune différence dans le type de fichier:

$ file madeinlinux.zip :  Zip archive data, at least v2.0 to extract
$ file madeinwindows.zip : Zip archive data, at least v2.0 to extract

Ils doivent être spécifiques à un fichier zip compatible Windows.

Est-ce que quelqu'un sait quoi?

studiohack
la source
1
Pourriez-vous produire l'un de ces fichiers ZIP (avec un contenu factice) et le placer sur un serveur pour que nous puissions le télécharger et l'inspecter?
Bernhard Hofmann
Cela ressemble à un cas pour superuser.com, s'il existe déjà.
1
Bien sûr, bernhard, voici le coupable: careerjet.co.uk/devel/Services_Careerjet.zip
La seule machine Windows que j'ai eu à tester était une machine sous Windows 7, qui n'a eu aucun problème pour ouvrir et extraire le fichier à l'aide de l'explorateur.
grêle windows 7!

Réponses:

28

Essayez avec:

zip -9 -y -r -q file.zip folder/
  • -9 Indique la vitesse de compression la plus lente (compression optimale, ignore la liste des suffixes)
  • -y Stocker les liens symboliques en tant que tels dans l’archive zip, au lieu de compresser et de stocker le fichier référencé par le lien
  • -r Déplacement récursif de la structure de répertoires
  • -q Mode silencieux
Igor Fobia
la source
Pourquoi cela aiderait-il avec la compatibilité XP?
Wowfunhappy
Honnêtement, il y a tellement de temps que je ne m'en souviens pas clairement; mais je peux imaginer que le fait de suivre les liens symboliques pourrait entraîner des problèmes (cela pourrait arriver sans -r) et -rvous permet de prendre tout le contenu du dossier
Igor Fobia
11

7zip est un outil de compression open source fonctionnant sous Linux, FreeBSD, Mac OS X, BeOS, DOS, Amiga et Windows.

Je le recommande fortement en fonction de la version Windows.

Elle supporte

emballage / déballage: 7z, ZIP, GZIP, BZIP2 et TAR

Décompression uniquement: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR et Z.

Bruce McLeod
la source
7
Je recommande de ne pas utiliser encore un autre outil propriétaire tiers pour cet utilitaire incroyablement commun (zip d'un fichier) disponible dès maintenant sur toutes les plateformes.
Rick O'Shea
8

La seule chose qui semble pertinente est-ce

-k - Attempt  to  convert  the  names  and paths to conform to MSDOS, store only the MSDOS attribute (just the user write attribute from UNIX), and mark the entry as made under
MSDOS (even though it was not); for compatibility with PKUNZIP under MSDOS which cannot handle certain names such as those with two dots.

mais lisez "man zip" sur votre système avant de partir ailleurs ...

Dan Rosenstark
la source
1
Salut. Merci pour la suggestion, mais cette option -k me ramène trop dans le temps. Il transforme tous les noms de fichiers en version à 8 caractères / sans majuscule :(
Oui, je me souviens de ces jours. Mais est-ce que cela a aidé le fichier à être lu par le programme Zip intégré sous Windows?
Je ne sais pas Cette question de nom de fichier m'a empêché d'essayer
Je suppose que c'est la compression, comme le dit MSalters ...
8

zip -Zdéfinit l'option de compression. -Z storeest le plus trivial, car il ne compresse pas du tout. Ceci est utile lorsque vous utilisez zipune alternative tarou un dépannage. Dans ce cas, vous devriez essayer de voir si une archive non compressée est utilisable à partir de Windows. Si cela est utilisable, vous savez que vous devrez choisir une option de compression autre que celle par défaut.

MSalters
la source
génial, je suppose que c'est l'algorithme de compression qui cause aussi des problèmes ...
4

En plus de ce que d’autres ont suggéré, il est important de porter une attention particulière à vos noms de fichiers et de répertoires car Windows n’apprécie pas nécessairement le chemin et les noms de fichiers Linux. Parfois, il leur échappe également différemment lors de la compression. Les exemples sont nombreux, mais surtout les fichiers point (. Et ..), les fichiers ne contenant que des différences de casse (name.txt et NAME.txt), les chemins de fichier absolus (/tmp/file.txt) . Certains autres caractères autorisés dans les noms de fichiers sous Windows peuvent poser des problèmes lorsque l'Explorateur Windows est utilisé pour ouvrir des fichiers. Dans mon cas, ":" le personnage a été décisif, mais il a fallu beaucoup de travail pour le découvrir.

Donc, avant de continuer à utiliser de nombreux paramètres, je vous suggère de suivre une procédure simple:

  1. Localisez le dossier ou le fichier de votre fermeture éclair.

  2. lancer: zip -9 -r -k zip-noms- modifiés.zip / chemin / vers / votre / dossier

  3. faites attention à ce que la console crache. Dans mon cas, les noms de fichiers ':' ont été supprimés.
  4. Déplacez le fichier zip sur une machine Windows et essayez de l'ouvrir.

Si cela fonctionne, il vaudrait peut-être mieux supprimer les caractères qui ont été supprimés par l'option -k de vos noms de fichiers / répertoires, essayez de compresser normalement. Notez que certains paramètres tels que -k ont ​​des effets secondaires. Dans ce cas, -k est en contradiction avec l'option -q (pour les liens sym).

De plus, l'option -k peut rendre vos noms de fichiers illisibles. Dans mon cas, mes fichiers ont été nommés en fonction du moment de la création (par exemple, 10: 55: 39.pdf) pour faciliter la localisation de la notice requise dans les archives, mais l'option -k l'a convertie en 105539.pdf, ce qui rend les données difficilement lisibles par les utilisateurs. J'ai donc changé les noms en 10_55_39.pdf qui s'ouvre sous Windows sans utiliser l'option -k mais reste lisible.

Shakus
la source
1
@ TD.512 avez-vous remarqué que la question de 6 ans n'a toujours pas de réponse précise? Le mieux est d’ajouter une autre réponse, si la réponse semble aider quelqu'un comme les autres ne le font pas.
Hi-Angel
3

Avait un problème similaire récemment avec les fichiers produits à partir d'un script Perl. Il a été constaté que le zip zip natif de Windows (testé sous Windows 7 uniquement) traitait de manière incorrecte les chemins avec une barre oblique et affichait un fichier zip vide. La solution consistait à supprimer la barre oblique avant d'ajouter des fichiers. Peut-être que certaines versions de la commande zip linux stockent des chemins de fichiers avec des barres obliques.

Nicholas Hardy
la source
2
Selon l'App. Remarques sur le site pkware ( pkware.com/support/zip-app-note/archives ): "Nom du fichier avec chemin relatif éventuel. Le chemin stocké ne doit pas contenir de lettre de lecteur ou de périphérique, ni de barre oblique. "
EKW
1

Voici un script python que j'utilise pour compresser certains fichiers. Il a été testé sur Ubuntu et Vista. Un zip généré sur Ubuntu s'ouvre avec la fermeture à glissière Vista.

Je pense que j'avais un problème similaire dans le passé et que c'était parce que le format zip n'était pas ZIP_DEFLATED. Je ne suis pas sûr. Je vais vérifier ça.

J'espère que ça aide

importer un fichier zip
importer glob, os, sys

classe ZipArchive:

    def zip_it (self, dirName, fichiers):
        dirNamePrefix = dirName + "/ *"
        pour le nom de fichier dans glob.glob (dirNamePrefix):
            si os.path.isfile (nomfichier) et (pas self.exclude_svn ou (nomfichier.find (". svn \\") == - 1)):
                Nom du fichier d'impression
                nom = nom du fichier [len (self.folder) +1:]
                self.archive.write (nom de fichier, nom, fichier zip.ZIP_DEFLATED)

    def run (self, dossier, nom, exclude_svn):
        self.exclude_svn = exclude_svn
        self.folder = dossier
        self.archive = zipfile.ZipFile (nom + ".zip", "w")
        os.path.walk (self.folder, ZipArchive.zip_it, self)
        self.archive.close ()

si __name__ == "__main__":
    if (len (sys.argv) == 1):
        print "dossier zipit d'utilisation [nom] [svn: oui | non]"
    autre:
        nom = sys.argv [1]
        exclude_svn = False

        if (len (sys.argv)> 2): nom = sys.argv [2]
        if (len (sys.argv)> 3): exclude_svn = (sys.argv [3] == "non")

        arch = ZipArchive ()
        arch.run (sys.argv [1], nom, exclude_svn)
        imprimer "fait"

luc
la source
la question est, peut-il être décompressé en utilisant le mécanisme de zip de Windows?
Oui. je l'ai ouvert avec l'outil zip Vista. J'espère que cela fonctionne pour vous aussi
0

Il y a probablement un problème dans votre transfert de fichier de Linux à Windows. Si vous utilisez FTP, essayez de définir un transfert binaire (commande bin sous Windows avant le transfert de vos fichiers de Linux à Windows).

Luis Andrés García
la source
Être en désaccord. J'ai rencontré des problèmes similaires à ceux de l'OP, en particulier avec les anciennes versions de Windows. J'ai fait des vérifications d'intégrité et la correspondance du shasum. De plus, notez que OP indique que les fichiers sont décompressés correctement dans des programmes tiers.
Wowfunhappy