Как создать zip-файл, совместимый с Windows под Linux

49

Мне нужно сделать zip-файл доступным для всех моих посетителей-пользователей Windows, поэтому я наивно создал zip-файл с помощью команды Unix zip (назовем его madeinlinux.zip).

Он успешно открывается с WinRar или Winzip, но те из моих пользователей, которые используют стандартную обработку файлов zip-файлов Windows, терпят неудачу при попытке распаковать его. (Windows XP)

Я сжал те же данные с помощью встроенного механизма почтового индекса Windows, и с точки зрения 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-файла.

Кто-нибудь знает что?

StudioHack
источник
1
Не могли бы вы создать один из этих ZIP-файлов (с фиктивным содержимым) и поместить его на сервер для загрузки и проверки?
Бернхард Хофманн
Это звучит как случай для superuser.com, если он еще существует.
1
Конечно, Бернхард, вот виновник: careerjet.co.uk/devel/Services_Careerjet.zip
Единственная машина с Windows, которую мне приходилось тестировать, была Windows 7, и у нее не было проблем с открытием и извлечением файла с помощью проводника.
Привет, Windows 7!

Ответы:

28

Попробуйте с:

zip -9 -y -r -q file.zip folder/
  • -9 Указывает на самую медленную скорость сжатия (оптимальное сжатие, игнорирует список суффиксов)
  • -y Храните символические ссылки как таковые в zip-архиве, вместо того, чтобы сжимать и хранить файл, на который ссылается ссылка
  • -r Путешествовать по структуре каталогов рекурсивно
  • -q Бесшумный режим
Игорь Фобия
источник
Почему это поможет с совместимостью с XP?
Wowfunhappy
Честно говоря, это было так давно, что я не помню ясно; но я могу себе представить, что следование по символическим ссылкам может привести к проблемам (которые могут произойти без -r) и -rпозволит вам взять все содержимое папки
Игорь Фобия
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
Я рекомендую не использовать еще один сторонний проприетарный инструмент для этой невероятно распространенной утилиты (zip a file), доступной сейчас на всех платформах.
Рик О'Ши
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-символьную версию без версии :(
Да, я помню те дни. Но помогло ли это чтение файла встроенной программой Zip в Windows?
Не знаю Эта проблема с именами файлов остановила меня
Я предполагаю, что это сжатие, как говорит MSalters ...
8

zip -Zустанавливает параметр сжатия. -Z storeявляется наиболее тривиальным, так как не сжимает вообще. Это полезно, когда вы используете zipв качестве альтернативы tarили для устранения неполадок. В этом случае вы должны попытаться проверить, можно ли использовать несжатый архив из Windows. Если это является полезным, вы знаете , что вы должны выбрать опцию сжатия не по умолчанию.

MSalters
источник
офигенно, я думаю, что этот алгоритм сжатия тоже доставляет неприятности ...
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 (для ссылок sym).

Также опция -k может сделать ваши имена файлов нечитаемыми. В моем случае мои файлы были названы в зависимости от времени создания (например, 10: 55: 39.pdf), чтобы упростить поиск нужной записи в архивах, но опция -k изменила ее на 105539.pdf, что нелегко прочитать пользователям. Поэтому я изменил имена на 10_55_39.pdf, который открывается в Windows без использования опции -k, но все еще доступен для чтения.

Shakus
источник
1
@ TD.512 Вы заметили, что на вопрос 6 лет все еще нет однозначного ответа? Лучше всего добавить еще один ответ, если он, кажется, помогает кому-то, а другие - нет.
Привет-ангел
3

Недавно была похожая проблема с файлами, созданными из сценария Perl. Обнаружено, что встроенный zip-архив Windows (только для Windows 7) неправильно обрабатывает пути с косой чертой и отображает пустой zip-файл. Решением было убрать косую черту перед добавлением файлов. Возможно, некоторые версии команд linux zip хранят пути к файлам с косой чертой.

Николас Харди
источник
2
Согласно приложению. Примечания на сайте pkware ( pkware.com/support/zip-app-note/archives ): «Имя файла с необязательным относительным путем. Сохраненный путь не должен содержать букву диска или устройства или начальную косую черту. "
EKW
2

Вот скрипт Python, который я использую для архивирования некоторых файлов. Он был протестирован на Ubuntu и Vista. Почтовый индекс, сгенерированный в Ubuntu, открывается вместе с молнией Vista.

Я думаю, что у меня была похожая проблема в прошлом, и это было потому, что формат zip не был ZIP_DEFLATED. Я не уверен. Я проверю это.

Я надеюсь, что это помогает

импортировать zipfile
импорт glob, os, sys

Класс ZipArchive:

    def zip_it (self, dirName, files):
        dirNamePrefix = dirName + "/ *"
        для имени файла в glob.glob (dirNamePrefix):
            если os.path.isfile (имя файла) и (не self.exclude_svn или (filename.find (". svn \\") == - 1)):
                напечатать имя файла
                имя = имя файла [len (self.folder) +1:]
                self.archive.write (имя файла, имя, zipfile.ZIP_DEFLATED)

    def run (self, folder, name, 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 ()

if __name__ == "__main__":
    if (len (sys.argv) == 1):
        напечатать "использование zipit папки [имя] [svn: да | нет]"
    еще:
        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] == "нет")

        arch = ZipArchive ()
        arch.run (sys.argv [1], имя, exclude_svn)
        печать "сделано"

Luc
источник
вопрос в том, можно ли его разархивировать с помощью механизма Windows zip?
да. я открыл его с помощью инструмента zip для Vista. Я надеюсь, что это работает для вас тоже
0

Возможно, проблема в переносе вашего файла из Linux в Windows. Если вы используете FTP, попробуйте установить двоичную передачу (команда bin в Windows, перед переносом ваших файлов из Linux в Windows).

Луис Андрес Гарсия
источник
Не согласен. Я столкнулся с такими же проблемами, как OP, особенно со старыми версиями Windows. Я сделал проверки целостности и соответствие шасума. Кроме того, обратите внимание, что OP говорит, что файлы распаковываются должным образом в сторонних программах.
Wowfunhappy