43

Мне нужно сделать 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-файла.

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

8 ответов8

24

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

zip -9 -y -r -q file.zip folder/
  • -9 Указывает на самую медленную скорость сжатия (оптимальное сжатие, игнорирует список суффиксов)
  • -y Хранить символические ссылки как таковые в zip-архиве вместо сжатия и сохранения файла, на который ссылается ссылка
  • -r Путешествовать по структуре каталогов рекурсивно
  • -q Тихий режим
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 -Z устанавливает параметр сжатия. -Z store самый тривиальный, так как он вообще не сжимается. Это полезно, когда вы используете zip в качестве альтернативы tar или для устранения неполадок. В этом случае вы должны попытаться проверить, можно ли использовать несжатый архив из Windows. Если это можно использовать, вы знаете , что вы должны выбрать опцию сжатия не по умолчанию.

6

Единственное, что выглядит актуально, это

-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" в вашей системе, прежде чем идти куда-либо еще ...

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, но все еще доступен для чтения.

3

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

1

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

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

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

import zipfile
import glob, os, sys

class ZipArchive:

    def zip_it(self, dirName, files):
        dirNamePrefix = dirName+"/*"
        for filename in 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"

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .