web-dev-qa-db-fra.com

Comment créer un fichier Compatible Zip avec Windows sous Linux

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 Unix Zip (appelons-le madeinlinux.Zip).

Il s’ouvre correctement avec WinRar ou Winzip, mais ceux de mes utilisateurs qui utilisent le traitement standard des fichiers Windows Zip échouent 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?

47
user3213

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 Parcoure la structure de répertoires de manière récursive
  • -q Mode silencieux
26
Igor Fobia

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.

11
Bruce McLeod

Zip -Z définit l'option de compression. -Z store est le plus trivial, car il ne compresse pas du tout. Ceci est utile lorsque vous utilisez Zip comme alternative à tar ou lors du 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.

8
MSalters

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 ...

7
Dan Rosenstark

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 : fichiers point (. Et ..), fichiers ne contenant que des différences de casse (name.txt et NAME.txt), chemins d'accès 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-nom- modifiables.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 un ordinateur 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, qui n'est pas facilement lisible 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.

4
Shakus

Avait un problème similaire récemment avec les fichiers produits à partir d'un script Perl. Découvert que Windows Zip natif (testé sous Windows 7 uniquement) gère de manière incorrecte les chemins avec une barre oblique et affiche un fichier zip vide. La solution consistait à supprimer la barre oblique avant d'ajouter des fichiers. Certaines versions de la commande linux Zip stockent peut-être des chemins de fichiers avec des barres obliques.

3
Nicholas Hardy

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 éclair de 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 
 
 class ZipArchive: 
 
 def Zip_it (self, dirName, files) : 
 dirNamePrefix = dirName + "/ *" 
 comme nom de fichier dans glob.glob (dirNamePrefix): 
 if os.path.isfile (nomfichier) et (pas self.exclude_svn ou ( filename.find (". svn \\") == - 1)): 
 Nom du fichier d'impression 
 nom = nom du fichier [len (self.folder) +1:] 
 self .archive.write (nom_fichier, nom_fichier.zip.Zip_DEFLATED) 
 
 def exécuté (auto, 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 () 
 
 if __== "__main __": 
 if (len (sys.argv) == 1): 
 print "utilisation du dossier zipit [nom] [svn: oui | non]" 
 sinon: 
 name = 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], name, exclude_svn) 
 print "done" 
 
1
luc

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

0