如何在Linux下创建与Windows兼容的zip文件


49

我需要为所有Windows用户访问者提供一个zip文件,因此我天真地使用Unix zip命令生成了一个zip文件(我们称其为madeinlinux.zip)。

它可以使用WinRar或Winzip成功打开,但是我的使用标准Windows zip文件处理的用户在尝试对其进行解压缩时遇到失败。(Windows XP)

我使用Windows内置的zip机制压缩了相同的数据,从Linux的角度来看,我看不到文件类型的任何区别:

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

它们必须是特定于Windows兼容zip文件的文件。

有人知道吗?


1
您能否产生其中一个ZIP文件(带有虚拟内容)并将其放在服务器上供我们下载和检查?
Bernhard Hofmann,2009年

这听起来像superuser.com的情况(如果存在)。

1
当然是伯恩哈德,这是罪魁祸首:careerjet.co.uk/devel/Services_Careerjet.zip

我唯一要测试的Windows机器是Windows 7,使用浏览器打开和提取文件没有问题。

冰雹Windows 7!

Answers:


28

尝试:

zip -9 -y -r -q file.zip folder/
  • -9 指示最慢的压缩速度(最佳压缩,忽略后缀列表)
  • -y 像这样将符号链接存储在zip存档中,而不是压缩和存储该链接引用的文件
  • -r 递归移动目录结构
  • -q 静音模式

为什么这对XP兼容性有帮助?
Wowfunhappy

老实说,很久以前,我不太清楚。但我可以想象,遵循符号链接可能会导致问题(如果不使用,可能会发生问题-r)并-r允许您使用所有文件夹内容
Igor Fobia

11

7zip是一个开放源代码压缩工具,可在Linux,FreeBSD,Mac OS X,BeOS,DOS,Amiga和Windows上运行。

我会根据Windows版本强烈推荐它。

它支持

装箱/拆箱:7z,ZIP,GZIP,BZIP2和TAR

仅拆包:ARJ,CAB,CHM,CPIO,DEB,DMG,HFS,ISO,LZH,LZMA,MSI,NSIS,RAR,RPM,UDF,WIM,XAR和Z。


8
我建议不要使用另一个第三方专有工具来使用此令人难以置信的通用实用程序(压缩文件),该实用程序现已在所有平台上可用。
里克·奥谢

8

唯一看起来相关的是这个

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

但是请务必先阅读系统上的“ man zip”,然后再去其他地方...


1
你好 谢谢你的建议,但是这个-k选项使我倒退了很多时间。它以8个字符/无大小写的形式转换所有文件名:(

是的,我记得那些日子。但这是否有助于Windows上的内置Zip程序读取文件?

不知道 此文件名问题阻止了我尝试

我的猜测是压缩,就像MSalters所说的那样……

8

zip -Z设置压缩选项。-Z store是最琐碎的,因为它根本不压缩。当您zip用作的替代品tar或进行故障排除时,此功能很有用。在这种情况下,您应该尝试查看Windows是否可以使用未压缩的存档。如果可以使用,则您必须选择一个非默认压缩选项。


太棒了,我想这也是造成麻烦的压缩算法……

4

除了其他建议外,重要的是要注意您的文件和目录名称,因为Windows不一定喜欢Linux文件路径和名称。有时在压缩时也会以不同的方式逃避它们。例子很多,但最重要的是点文件(。和..),仅大小写不同的文件(name.txt和NAME.txt),绝对文件路径(/tmp/file.txt)。使用Windows资源管理器打开文件时,Windows上文件名中允许的其他一些字符可能会导致问题。在我的案例中,“:”字符是交易突破者,但花了很多功夫才能找到答案。

因此,在继续使用很多参数之前,我建议您遵循一个简单的步骤:

  1. 找到该文件夹​​或归档您的压缩文件。

  2. 运行: zip -9 -r -k zip-modified-names.zip / path / to / your / folder

  3. 注意控制台吐出的东西。 在我的情况下,文件名中的':'被删除。
  4. 将zip文件移动到Windows计算机上,然后尝试将其打开。

如果可行,则最好从文件/目录名称中删除用-k选项删除的字符,然后尝试正常压缩。 请注意,某些参数(例如-k)具有副作用。 在这种情况下,-k与-q选项(对于符号链接)矛盾。

另外,-k选项可能会使您的文件名不可读。在我的情况下,我的文件是根据创建时间命名的(例如10:55:39.pdf),以便于轻松地从档案中查找所需的记录,但是-k选项将其更改为105539.pdf,这对于用户来说并不容易阅读。因此,我将名称更改为10_55_39.pdf,该名称在Windows上打开时不使用-k选项,但仍然可读。


1
@ TD.512您是否注意到6岁的问题仍然没有确定的答案?最好添加另一个答案,如果该答案似乎对某人的帮助不如其他人。
Hi-Angel

3

最近,从perl脚本生成的文件也遇到了类似的问题。发现本机Windows zip(仅经过测试的Windows 7)错误地处理了带有斜杠的路径并显示了空的zipfile。解决方案是在添加文件之前先去除斜杠。某些版本的linux zip命令可能会以斜杠存储文件路径。


2
根据应用程序。pkware站点(pkware.com/support/zip-app-note/archives)上的注释:“文件名,带有可选的相对路径。存储的路径不应包含驱动器或设备字母或斜杠。 ”
EKW

2

这是我用来压缩某些文件的python脚本。它已经在ubuntu和Vista上进行了测试。在Ubuntu上生成的zip随Vista拉链一起打开。

我认为过去我也遇到过类似的问题,这是因为zip格式不是ZIP_DEFLATED。我不确定。我会检查的。

希望对您有所帮助

导入压缩文件
导入glob,os,sys

ZipArchive类:

    def zip_it(自己,目录名,文件):
        dirNamePrefix = dirName +“ / *”
        用于glob.glob(dirNamePrefix)中的文件名:
            如果是os.path.isfile(filename)和(不是self.exclude_svn或(filename.find(“。svn \\”)==-1)):
                打印文件名
                名称=文件名[len(self.folder)+1:]
                self.archive.write(文件名,名称,zipfile.ZIP_DEFLATED)

    def运行(自身,文件夹,名称,exclude_svn):
        self.exclude_svn = exclude_svn
        self.folder =文件夹
        self.archive = zipfile.ZipFile(name +“。zip”,“ w”)
        os.path.walk(self.folder,ZipArchive.zip_it,self)
        self.archive.close()

如果__name__ ==“ __main__”:
    如果(len(sys.argv)== 1):
        打印“使用zipit文件夹[名称] [svn:yes | no]”
    其他:
        名称= sys.argv [1]
        exclude_svn = False

        如果(len(sys.argv)> 2):名称= sys.argv [2]
        如果(len(sys.argv)> 3):exclude_svn =(sys.argv [3] ==“ no”)

        拱= ZipArchive()
        arch.run(sys.argv [1],名称,exclude_svn)
        打印“完成”


问题是,可以使用Windows zip机制将其解压缩吗?

是。我已经用Vista压缩工具打开了它。我希望它也对您

0

从Linux到Windows的文件传输可能存在问题。如果您使用的是FTP,请尝试设置二进制传输(在Windows中,将文件从Linux传输到Windows之前,请使用bin命令)。


不同意。我遇到了与OP类似的问题,尤其是旧版本的Windows。我已经进行了完整性检查,并且对shasum进行了匹配。另外,请注意,OP表示文件在第三方程序中已正确解压缩。
Wowfunhappy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.