Jak utworzyć plik zip zgodny z systemem Windows w systemie Linux

49

Muszę udostępnić plik zip wszystkim moim użytkownikom systemu Windows, więc naiwnie utworzyłem plik zip za pomocą polecenia zip w systemie Unix (nazwijmy go madeinlinux.zip).

Z powodzeniem otwiera się w WinRar lub Winzip, ale ci z moich użytkowników, którzy używają standardowej obsługi plików zip Windows, doświadczają niepowodzenia podczas próby rozpakowania. (Windows XP)

Skompresowałem te same dane za pomocą wbudowanego systemu Windows w mechanizmie zip i z punktu widzenia systemu Linux nie widzę żadnej różnicy w typie pliku:

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

Muszą być czymś specyficznym dla pliku zip kompatybilnego z Windows.

Czy ktoś wie co?

studiohack
źródło
1
Czy możesz stworzyć jeden z tych plików ZIP (z obojętną zawartością) i umieścić go na serwerze, abyśmy mogli go pobrać i sprawdzić?
Bernhard Hofmann,
To brzmi jak przypadek superuser.com, jeśli jeszcze istnieje.
1
Jasne, Bernhard, oto winowajca: karieryjet.co.uk/devel/Services_Careerjet.zip
Jedyną maszyną z systemem Windows, którą musiałem przetestować, był Windows 7 i nie miałem problemów z otwieraniem i rozpakowywaniem pliku za pomocą Eksploratora.
grad Windows 7!

Odpowiedzi:

28

Spróbuj z:

zip -9 -y -r -q file.zip folder/
  • -9 Wskazuje najwolniejszą prędkość kompresji (optymalna kompresja, ignoruje listę sufiksów)
  • -y Przechowuj dowiązania symboliczne jako takie w archiwum zip, zamiast kompresować i przechowywać plik, do którego odwołuje się łącze
  • -r Podróżuj rekurencyjnie po strukturze katalogów
  • -q Tryb cichy
Igor Fobia
źródło
Dlaczego miałoby to pomóc w zgodności z XP?
Wowfunhappy
Szczerze mówiąc, to było tak dawno temu, że nie pamiętam wyraźnie; ale mogę sobie wyobrazić, że podążanie za symbolicznymi linkami może prowadzić do problemów (które mogą się zdarzyć bez -r) i -rpozwala zabrać całą zawartość folderu
Igor Fobia
11

7zip to narzędzie do kompresji typu open source, które działa w systemach Linux, FreeBSD, Mac OS X, BeOS, DOS, Amiga i Windows.

Gorąco polecam w oparciu o wersję systemu Windows.

To wspiera

pakowanie / rozpakowywanie: 7z, ZIP, GZIP, BZIP2 i TAR

Tylko rozpakowywanie: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR i Z.

Bruce McLeod
źródło
8
Nie polecam używania innego, zastrzeżonego narzędzia innej firmy do tego niewiarygodnie powszechnego narzędzia (skompresowanie pliku) dostępnego teraz na wszystkich platformach.
Rick O'Shea,
8

Jedyne, co wygląda na istotne, to to

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

ale przeczytaj „man zip” w swoim systemie, zanim pójdziesz gdziekolwiek indziej ...

Dan Rosenstark
źródło
1
Cześć. Dziękuję za sugestię, ale ta opcja -k zabiera mnie trochę w przeszłość. Przekształca całą nazwę pliku w 8
Tak, pamiętam te dni. Ale czy pomógł w odczytaniu pliku przez wbudowany program Zip w systemie Windows?
Nie wiem Ta nazwa pliku problem zatrzymał mnie bolesny
Domyślam się, że jest to kompresja, jak mówi MSalters ...
8

zip -Zustawia opcję kompresji. -Z storejest najbardziej trywialny, ponieważ nie kompresuje się wcale. Jest to przydatne, gdy używasz zipjako alternatywy tarlub podczas rozwiązywania problemów. W takim przypadku powinieneś spróbować sprawdzić, czy nieskompresowane archiwum można wykorzystać w systemie Windows. Jeśli jest to użyteczne, wiesz, że będziesz musiał wybrać niestandardową opcję kompresji.

MSalters
źródło
niesamowite, domyślam się, że to algorytm kompresji również powoduje problemy ...
4

Oprócz tego, co sugerują inni, należy zwrócić uwagę na nazwy plików i katalogów, ponieważ system Windows niekoniecznie lubi ścieżkę i nazwy plików systemu Linux. Czasami również ucieka im inaczej podczas zipowania. Przykładami są liczne, ale przede wszystkim pliki kropkowe (. I ..), pliki z różnicami tylko liter (name.txt i NAME.txt), bezwzględne ścieżki do plików (/tmp/file.txt) . Niektóre inne znaki dozwolone w nazwach plików w systemie Windows mogą powodować problemy, gdy Eksplorator Windows jest używany do otwierania plików. W moim przypadku znak „:” przełamał umowę, ale dużo się zajęło, aby się tego dowiedzieć.

Więc zanim wznowisz korzystanie z wielu parametrów, sugeruję wykonać prostą procedurę:

  1. Znajdź folder lub plik, który chcesz skompresować.

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

  3. zwróć uwagę na to, co wypluwa konsola. W moim przypadku „:” w nazwach plików zostały usunięte.
  4. Przenieś plik zip na maszynę z systemem Windows i spróbuj go otworzyć.

Jeśli to zadziała, być może lepiej będzie usunąć znaki, które zostały usunięte przy pomocy opcji -k z nazw plików / katalogów, spróbuj spakować się normalnie. Uwaga: niektóre parametry, takie jak -k, mają skutki uboczne. W tym przypadku -k jest sprzeczne z opcją -q (dla dowiązań sym).

Również opcja -k może sprawić, że twoje nazwy plików będą nieczytelne. W moim przypadku moje pliki zostały nazwane na podstawie czasu utworzenia (np. 10: 55: 39.pdf), aby ułatwić łatwą lokalizację wymaganego rekordu z archiwów, ale opcja -k zmieniła go na 105539.pdf, który nie jest łatwy do odczytania przez użytkowników. Dlatego zmieniłem nazwy na 10_55_39.pdf, który otwiera się w systemie Windows bez użycia opcji -k, ale nadal jest czytelny.

Shakus
źródło
1
@ TD.512 czy zauważyłeś, że 6-letnie pytanie wciąż nie ma jednoznacznej odpowiedzi? Najlepiej dodać kolejną odpowiedź, jeśli wydaje się, że pomaga komuś tak jak inni.
Hi-Angel,
3

Miałem ostatnio podobny problem z plikami utworzonymi ze skryptu Perla. Stwierdzono, że natywny zip systemu Windows (tylko przetestowany Windows 7) niepoprawnie obsługuje ścieżki z wiodącym ukośnikiem i wyświetla pusty plik zip. Rozwiązaniem było usunięcie głównego ukośnika przed dodaniem plików. Być może niektóre wersje linux zip przechowują ścieżki plików z wiodącymi ukośnikami.

Nicholas Hardy
źródło
2
Zgodnie z aplikacją. Uwagi na temat strony pkware ( pkware.com/support/zip-app-note/archives ): „Nazwa pliku z opcjonalną ścieżką względną. Zapisana ścieżka nie powinna zawierać litery dysku ani urządzenia ani początkowego ukośnika. „
EKW
2

Oto skrypt Pythona, którego używam do skompresowania niektórych plików. Został przetestowany na Ubuntu i Vista. Zip wygenerowany na Ubuntu otwiera się za pomocą suwaka Vista.

Wydaje mi się, że miałem podobny problem w przeszłości, ponieważ format zip nie był ZIP_DEFLATED. Nie jestem pewien. Sprawdzę to.

Mam nadzieję, że to pomoże

importuj plik zip
importuj glob, os, sys

klasa ZipArchive:

    def zip_it (self, dirName, files):
        dirNamePrefix = dirName + "/ *"
        dla nazwy pliku w glob.glob (dirNamePrefix):
            if os.path.isfile (nazwa_pliku) i (nie self.exclude_svn lub (nazwa_pliku.find (". svn \\") == - 1)):
                wydrukuj nazwę pliku
                name = nazwa pliku [len (self.folder) +1:]
                self.archive.write (nazwa pliku, nazwa, plik zip.ZIP_DEFLATED)

    def run (self, folder, name, exclude_svn):
        self.exclude_svn = exclude_svn
        self.folder = folder
        self.archive = zipfile.ZipFile (nazwa + „. zip”, „w”)
        os.path.walk (self.folder, ZipArchive.zip_it, self)
        self.archive.close ()

jeśli __name__ == "__main__":
    if (len (sys.argv) == 1):
        print "użycie folderu zipit [nazwa] [svn: tak | nie]"
    jeszcze:
        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)
        wydrukuj „gotowe”

luc
źródło
pytanie brzmi: czy można go rozpakować za pomocą mechanizmu zip systemu Windows?
tak. otworzyłem go za pomocą narzędzia zip Vista. Mam nadzieję, że to również dla ciebie
0

Prawdopodobnie występuje problem z przenoszeniem plików z systemu Linux na system Windows. Jeśli używasz FTP, spróbuj ustawić transfer binarny (polecenie bin w systemie Windows, przed przeniesieniem plików z systemu Linux na Windows).

Luis Andrés García
źródło
Nie zgadzać się. Mam podobne problemy jak OP, szczególnie ze starszymi wersjami Windows. Przeprowadziłem kontrole integralności i szasum się zgadza. Dodatkowo zauważ, że OP mówi, że pliki poprawnie dekompresują się w programach innych firm.
Wowfunhappy