web-dev-qa-db-ja.com

LinuxでWindowsと互換性のあるZipファイルを作成する方法

私はすべてのWindowsユーザーの訪問者がZipファイルを利用できるようにする必要があるため、Unix Zipコマンド(madeinlinux.Zipと呼びます)で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ファイルに固有のものでなければなりません。

誰か知っていますか?

49
user3213

試してみてください:

Zip -9 -y -r -q file.Zip folder/
  • -9最も遅い圧縮速度を示します(最適な圧縮、サフィックスリストは無視されます)
  • -yリンクが参照するファイルを圧縮して保存する代わりに、Zipアーカイブにシンボリックリンクをそのまま保存します。
  • -rディレクトリ構造を再帰的に移動します
  • -qクワイエットモード
28
Igor Fobia

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。

11
Bruce McLeod

関連しているように見えるのはこれだけです

-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」を読んでください...

8
Dan Rosenstark

Zip -Zは圧縮オプションを設定します。 -Z storeはまったく圧縮しないため、最も簡単なものです。これは、Zipの代わりにtarを使用している場合、またはトラブルシューティングを行う場合に役立ちます。この場合、非圧縮アーカイブがWindowsから使用できるかどうかを確認する必要があります。 isが使用可能な場合、デフォルト以外の圧縮オプションを選択する必要があることがわかります。

8
MSalters

他の人が示唆したことに加えて、Windowsは必ずしもLinuxファイルのパスと名前を好まないため、ファイル名とディレクトリ名に注意することが重要ですです。また、zipを実行するときに、エスケープが異なる場合もあります。例は多数ありますが、最も重要なのはドットファイル(。および..)、大文字と小文字のみが異なるファイル(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に変更しました。このファイルは、-kオプションを使用せずにWindowsで開きますが、引き続き読み取ることができます。

4
Shakus

最近、Perlスクリプトから生成されたファイルで同様の問題が発生しました。ネイティブWindows Zip(テスト済みのWindows 7のみ)がスラッシュを含むパスを誤って処理し、空のzipファイルを表示することがわかりました。解決策は、ファイルを追加する前に先頭のスラッシュを取り除くことでした。おそらく、一部のバージョンのLinux Zipコマンドは、先頭にスラッシュを含むファイルパスを格納します。

3
Nicholas Hardy

これは、pythonスクリプトを使用して、いくつかのファイルをZipするために使用しています。ubuntuおよびVistaでテストされています。Ubuntuで生成されたZipは、Vistaジッパーで開きます。

過去にも同様の問題があったと思いますが、それはZip形式がZip_DEFLATEDではなかったためです。私はわかりません。確認します。

それが役に立てば幸い

 import zipfile 
 import glob、os、sys 
 
 class ZipArchive:
 
 def Zip_it(self、dirName、files) :
 dirNamePrefix = dirName + "/ *" 
 for glob.glob(dirNamePrefix):
 if os.path.isfile(filename)and(not self.exclude_svn or( filename.find( "。svn \\")==-1)):
 print filename 
 name = filename [len(self.folder)+1:] 
 self .archive.write(filename、name、zipfile.Zip_DEFLATED)
 
 def run(self、folder、name、exclude_svn):
 self.exclude_svn = exclude_svn 
 self.folder = folder 
 self.archive = zipfile.ZipFile(name + "。Zip"、 "w")
 os.path.walk(self.folder、ZipArchive.Zip_it、self)
 self.archive.close()
 
 if __name__ == "__main __":
 if(len(sys.argv)== 1):
 print "usage zipit folder [name] [svn:yes | no]" 
 else:
 name = sys.argv [1] 
 exclude_svn = False 
 
 if(len(sys.argv)> 2):name = sys.argv [2] 
 if(len(sys.argv)> 3):exclude_svn =(sys.argv [3] == "no")
 
 Arch = ZipArchive()
 Arch。 run(sys.argv [1]、name、exclude_svn)
 print "done" 
 
2
luc

LinuxからWindowsへのファイル転送に問題がある可能性があります。 FTPを使用している場合は、バイナリ転送を設定してみてください(LinuxからWindowsにファイルを転送する前に、Windowsのbinコマンド)。