So erstellen Sie eine mit Windows kompatible Zip-Datei unter Linux

49

Ich muss allen Besuchern meiner Windows-Benutzer eine Zip-Datei zur Verfügung stellen, daher habe ich naiv eine Zip-Datei mit dem Unix-Befehl zip erstellt (nennen wir es madeinlinux.zip).

Es wird erfolgreich mit WinRar oder Winzip geöffnet, aber diejenigen meiner Benutzer, die die standardmäßige Windows-ZIP-Dateiverwaltung verwenden, versagen beim Entpacken. (Windows XP)

Ich habe dieselben Daten mit dem in Windows integrierten Zip-Mechanismus komprimiert und aus Linux-Sicht kann ich keinen Unterschied im Dateityp feststellen:

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

Sie müssen spezifisch für eine Windows-kompatible ZIP-Datei sein.

Weiß jemand was?

Studiohack
quelle
1
Können Sie eine dieser ZIP-Dateien (mit Dummy-Inhalten) erstellen und auf einen Server stellen, damit wir sie herunterladen und überprüfen können?
Bernhard Hofmann
Dies klingt wie ein Fall für superuser.com, wenn es noch existiert.
1
Klar Bernhard, hier ist der Schuldige: careerjet.co.uk/devel/Services_Careerjet.zip
Die einzige Windows-Maschine, die ich testen musste, war eine Windows-7-Maschine, die problemlos mit dem Explorer geöffnet und extrahiert werden konnte.
Hagel Windows 7!

Antworten:

28

Versuche es mit:

zip -9 -y -r -q file.zip folder/
  • -9 Gibt die langsamste Komprimierungsgeschwindigkeit an (optimale Komprimierung, ignoriert die Suffix-Liste)
  • -y Speichern Sie symbolische Links als solche im ZIP-Archiv, anstatt die Datei, auf die der Link verweist, zu komprimieren und zu speichern
  • -r Durchlaufen Sie die Verzeichnisstruktur rekursiv
  • -q Ruhemodus
Igor Fobia
quelle
Warum würde dies bei der XP-Kompatibilität helfen?
Wowfunhappy
Ehrlich gesagt war es so lange her, dass ich mich nicht mehr genau erinnere; aber ich kann mir vorstellen, dass das folgen der symbolischen links zu problemen führen könnte (die ohne passieren könnten -r) und -rermöglicht es ihnen, den gesamten
ordnerinhalt zu
11

7zip ist ein Open Source-Komprimierungsprogramm, das unter Linux, FreeBSD, Mac OS X, BeOS, DOS, Amiga und Windows funktioniert.

Ich würde es sehr empfehlen, basierend auf der Windows-Version.

Es unterstützt

Packen / Auspacken: 7z, ZIP, GZIP, BZIP2 und TAR

Nur auspacken: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, MSI, RAR, RPM, UDF, WIM, XAR und Z.

Bruce McLeod
quelle
8
Ich empfehle, für dieses unglaublich verbreitete Hilfsprogramm (zip a file), das jetzt auf allen Plattformen verfügbar ist, kein proprietäres Tool eines Drittanbieters zu verwenden.
Rick O'Shea
8

Das einzige, was relevant aussieht, ist das

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

Aber lies "man zip" auf deinem System, bevor du irgendwohin gehst ...

Dan Rosenstark
quelle
1
Hallo. Vielen Dank für den Vorschlag, aber diese Option -k bringt mich ein bisschen zu viel in die Vergangenheit. Alle Dateinamen werden in eine 8-
Ja, ich erinnere mich an diese Tage. Aber hat es der Datei geholfen, vom integrierten Zip-Programm unter Windows gelesen zu werden?
Ich weiß es nicht. Dieses Problem mit dem Dateinamen hat mich davon
Ich vermute, dass es die Komprimierung ist, wie MSalters sagt ...
8

zip -ZLegt die Komprimierungsoption fest. -Z storeist die trivialste, da sie überhaupt nicht komprimiert wird. Dies ist nützlich, wenn Sie zipals Alternative für taroder bei der Fehlerbehebung verwenden. In diesem Fall sollten Sie versuchen, festzustellen, ob ein nicht komprimiertes Archiv unter Windows verwendet werden kann. Wenn das ist verwendbar, wissen Sie , dass Sie eine Nicht-Standard - Komprimierungsoption wählen müssen.

MSalters
quelle
Super, ich denke, es ist der Komprimierungsalgorithmus, der auch Probleme verursacht ...
4

Zusätzlich zu den Vorschlägen anderer ist es wichtig, auf Ihre Datei- und Verzeichnisnamen zu achten, da Windows den Pfad und die Namen von Linux-Dateien nicht unbedingt mag. Es entgeht ihnen manchmal auch anders beim Zippen. Beispiele sind zahlreiche, aber vor allem Punktdateien (. Und ..), Dateien mit nur Groß- und Kleinschreibung (name.txt und NAME.txt), absolute Dateipfade (/tmp/file.txt) . Einige andere Zeichen, die in Dateinamen unter Windows zulässig sind, können Probleme verursachen, wenn Windows Explorer zum Öffnen von Dateien verwendet wird. In meinem Fall war ':' der Deal Breaker, aber ich habe viel Arbeit investiert, um das herauszufinden.

Bevor Sie mit der Verwendung vieler Parameter fortfahren, sollten Sie einen einfachen Vorgang ausführen:

  1. Suchen Sie den Ordner oder die Datei, die Sie komprimieren möchten.

  2. Führen Sie Folgendes aus : zip -9 -r -k zip-modified-names.zip / path / to / your / folder

  3. Achten Sie darauf, was die Konsole ausspuckt. In meinem Fall wurde das ':' in den Dateinamen entfernt.
  4. Verschieben Sie die ZIP-Datei auf einen Windows-Computer und versuchen Sie, sie zu öffnen.

Wenn dies funktioniert, ist es möglicherweise besser, die mit der Option -k entfernten Zeichen aus den Datei- / Verzeichnisnamen zu entfernen. Versuchen Sie, normal zu komprimieren. Beachten Sie, dass einige Parameter wie -k Nebenwirkungen haben. In diesem Fall widerspricht -k der Option -q (für sym-Links).

Auch die Option -k kann Ihre Dateinamen unleserlich machen. In meinem Fall wurden meine Dateien basierend auf der Erstellungszeit benannt (z. B. 10: 55: 39.pdf), um das einfache Auffinden des erforderlichen Datensatzes aus Archiven zu erleichtern. Die Option -k hat sie jedoch in 105539.pdf geändert, was für Benutzer nicht leicht lesbar ist. Ich habe daher den Namen in 10_55_39.pdf geändert, was unter Windows ohne die Option -k geöffnet wird, aber immer noch lesbar ist.

Shakus
quelle
1
@ TD.512 ist dir aufgefallen, dass die 6 Jahre alte Frage noch keine definitive Antwort hat? Fügen Sie am besten eine weitere Antwort hinzu, wenn die Antwort jemandem zu helfen scheint, während andere dies nicht taten.
Hi-Angel
3

Hatte kürzlich ein ähnliches Problem mit Dateien, die mit einem Perl-Skript erstellt wurden. Es wurde festgestellt, dass natives Windows Zip (nur Windows 7 getestet) Pfade mit einem führenden Schrägstrich falsch verarbeitet und eine leere Zip-Datei anzeigt. Die Lösung bestand darin, den führenden Schrägstrich vor dem Hinzufügen von Dateien zu entfernen. Möglicherweise speichern einige Versionen des Linux-Befehls zip Dateipfade mit führenden Schrägstrichen.

Nicholas Hardy
quelle
2
Laut der App. Hinweise zur pkware-Site ( pkware.com/support/zip-app-note/archives ): "Der Name der Datei mit optionalem relativen Pfad. Der gespeicherte Pfad sollte keinen Laufwerks- oder Gerätebuchstaben oder einen führenden Schrägstrich enthalten. "
EKW
2

Hier ist ein Python-Skript, mit dem ich einige Dateien komprimiere. Es wurde unter Ubuntu und Vista getestet. Mit dem Vista-Reißverschluss wird ein unter Ubuntu generierter Reißverschluss geöffnet.

Ich denke, dass ich in der Vergangenheit ein ähnliches Problem hatte und es lag daran, dass das zip-Format nicht ZIP_DEFLATED war. Ich bin mir nicht sicher. Ich werde das überprüfen.

Ich hoffe, es hilft

zip-datei importieren
import glob, os, sys

Klasse ZipArchive:

    def zip_it (self, dirName, files):
        dirNamePrefix = dirName + "/ *"
        für den Dateinamen in glob.glob (dirNamePrefix):
            if os.path.isfile (filename) and (not self.exclude_svn or (filename.find (". svn \\") == - 1)):
                Dateiname drucken
                name = filename [len (self.folder) +1:]
                self.archive.write (Dateiname, Name, zipfile.ZIP_DEFLATED)

    def run (self, ordner, name, exclude_svn):
        self.exclude_svn = exclude_svn
        self.folder = Ordner
        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 "Verwendung zipit Ordner [Name] [SVN: Ja | Nein]"
    sonst:
        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 "fertig"

luc
quelle
Die Frage ist, kann es mit dem Windows-Zip-Mechanismus entpackt werden?
Ja. Ich habe es mit dem Vista Zip-Tool geöffnet. Ich hoffe, es funktioniert auch für Sie
0

Wahrscheinlich liegt ein Problem bei der Dateiübertragung von Linux nach Windows vor. Wenn Sie FTP verwenden, versuchen Sie, eine Binärübertragung festzulegen (Befehl bin in Windows, bevor Sie Ihre Dateien von Linux nach Windows übertragen).

Luis Andrés García
quelle
Nicht zustimmen. Ich bin auf ähnliche Probleme gestoßen wie das OP, besonders bei alten Windows-Versionen. Ich habe Integritätsprüfungen durchgeführt und das Shasum stimmt überein. Beachten Sie außerdem, dass OP sagt, dass die Dateien in Programmen von Drittanbietern ordnungsgemäß dekomprimiert werden.
Wowfunhappy