Como criar um arquivo zip compatível com o Windows no Linux

49

Eu preciso disponibilizar um arquivo zip para todos os visitantes de meus usuários do Windows, então eu produzi um arquivo zip com o comando zip do Unix (vamos chamá-lo de madeinlinux.zip).

Ele é aberto com sucesso com o WinRar ou o Winzip, mas os usuários que estão usando o manuseio de arquivos zip padrão do Windows sofrem falha ao tentar descompactá-lo. (Windows XP)

Compactei os mesmos dados usando o mecanismo zip interno do Windows e, do ponto de vista do Linux, não vejo diferença no tipo de arquivo:

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

Eles devem ser algo específico para um arquivo zip compatível com o Windows.

Alguém sabe o que?

studiohack
fonte
1
Você poderia produzir um desses arquivos ZIP (com conteúdo fictício) e colocá-lo em um servidor para baixar e inspecionar?
10249 Bernhard Hofmann
Parece um caso para o superuser.com, se ele ainda existe.
1
Bernhard certeza, aqui está o culpado: careerjet.co.uk/devel/Services_Careerjet.zip
A única máquina Windows que eu tive que testar foi a do Windows 7, e isso não teve problemas para abrir e extrair o arquivo usando o explorer.
granizo janelas 7!

Respostas:

28

Tente com:

zip -9 -y -r -q file.zip folder/
  • -9 Indica a velocidade de compactação mais lenta (compactação ideal, ignora a lista de sufixos)
  • -y Armazene links simbólicos como tais no arquivo zip, em vez de compactar e armazenar o arquivo referido pelo link
  • -r Percorrer a estrutura de diretórios recursivamente
  • -q Modo silencioso
Igor Fobia
fonte
Por que isso ajudaria na compatibilidade com o XP?
Wowfunhappy
Honestamente, faz tanto tempo que não me lembro claramente; mas posso imaginar que seguir os links simbólicos pode levar a problemas (que podem acontecer sem -r) e -rpermite que você pegue todo o conteúdo da pasta
Igor Fobia
11

O 7zip é uma ferramenta de compactação de código aberto que funciona em Linux, FreeBSD, Mac OS X, BeOS, DOS, Amiga e Windows.

Eu recomendo com base na versão do Windows.

Suporta

embalagem / desembalagem: 7z, ZIP, GZIP, BZIP2 e TAR

Apenas desembalando: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RIS, RPM, UDF, WIM, XAR e Z.

Bruce McLeod
fonte
8
Eu recomendo não usar ainda outra ferramenta proprietária de terceiros para este utilitário inacreditavelmente comum (zipar um arquivo) disponível agora em todas as plataformas.
Rick O'Shea
8

A única coisa que parece relevante é essa

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

mas leia "man zip" no seu sistema antes de ir para outro lugar ...

Dan Rosenstark
fonte
1
Oi. Thx pela sugestão, mas essa opção -k me leva de volta no tempo um pouco demais. Ele transforma todos nome do arquivo em um 8 caracteres / nenhuma versão caso :(
Sim, eu lembro daqueles dias. Mas ajudou o arquivo a ser lido pelo programa Zip interno no Windows?
Não sei. Esta edição nome do arquivo me parou de tentar
Meu palpite é que é a compressão, como MSalters diz ...
8

zip -Zdefine a opção de compactação. -Z storeé o mais trivial, pois não é compactado. Isso é útil quando você está usando zipcomo alternativa tarou na solução de problemas. Nesse caso, você deve tentar verificar se um arquivo descompactado é utilizável no Windows. Se isso for utilizável, você saberá que precisará escolher uma opção de compactação não padrão.

MSalters
fonte
incrível, eu acho que é o algoritmo de compressão que está causando problemas também ...
4

Além do que os outros sugeriram, é importante prestar atenção aos nomes de arquivos e diretórios, pois o Windows não gosta necessariamente dos nomes e caminho dos arquivos do Linux. Às vezes, também os escapa de maneira diferente ao fechar. Os exemplos são numerosos, mas o mais importante são os arquivos de ponto (. E ..), arquivos com apenas diferenças de maiúsculas e minúsculas (name.txt e NAME.txt), caminhos de arquivo absolutos (/tmp/file.txt) . Alguns outros caracteres permitidos nos nomes de arquivos no Windows podem causar problemas quando o Windows Explorer é usado para abrir arquivos. No meu caso, o personagem ':' foi o rompedor de acordos, mas foi preciso muito trabalho para descobrir isso.

Portanto, antes de você continuar usando vários parâmetros, sugiro seguir um procedimento simples:

  1. Localize a pasta ou arquivo que está fechando.

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

  3. preste atenção ao que o console cospe. No meu caso, ':' nos nomes dos arquivos foram removidos.
  4. Mova o arquivo zip para uma máquina Windows e tente abri-lo.

Se isso funcionar, é melhor remover os caracteres que foram retirados pela opção -k dos nomes de arquivos / diretórios e tente fechar normalmente. Observe que alguns parâmetros como -k têm efeitos colaterais. Nesse caso, -k contradiz a opção -q (para links sym).

A opção -k também pode tornar os nomes dos arquivos ilegíveis. No meu caso, meus arquivos foram nomeados com base no tempo de criação (por exemplo, 10: 55: 39.pdf) para facilitar a localização fácil do registro necessário dos arquivos, mas a opção -k o transformou em 105539.pdf, que não é facilmente legível pelos usuários. Alterei os nomes para 10_55_39.pdf, que é aberto no Windows sem usar a opção -k, mas ainda é legível.

Shakus
fonte
1
@ TD.512 você notou que a pergunta de 6 anos ainda não tem uma resposta definitiva? Melhor adicionar outra resposta, se a resposta parecer ajudar alguém como os outros não.
Hi-Angel
3

Recentemente, tive um problema semelhante com arquivos produzidos a partir de um script perl. Verificou que o zip nativo do Windows (somente Windows 7 testado) manipula incorretamente os caminhos com uma barra inicial e exibe um arquivo zip vazio. A solução foi remover a barra principal antes de adicionar arquivos. Talvez algumas versões do comando linux zip armazenem caminhos de arquivos com barras principais.

Nicholas Hardy
fonte
2
De acordo com o aplicativo. Observações no site do pkware ( pkware.com/support/zip-app-note/archives ): "O nome do arquivo, com caminho relativo opcional. O caminho armazenado não deve conter uma letra de unidade ou dispositivo, nem uma barra principal. "
EKW
2

Aqui está um script python que estou usando para compactar alguns arquivos. Foi testado no ubuntu e no Vista. Um zip gerado no Ubuntu é aberto com o zíper do Vista.

Acho que tive um problema semelhante no passado e foi porque o formato zip não era ZIP_DEFLATED. Não tenho certeza. Vou verificar isso.

Espero que ajude

importar zipfile
importação glob, os, sys

classe ZipArchive:

    def zip_it (self, dirName, arquivos):
        dirNamePrefix = dirName + "/ *"
        para o nome do arquivo no glob.glob (dirNamePrefix):
            se os.path.isfile (nome do arquivo) e (não self.exclude_svn ou (filename.find (". svn \\") == - 1)):
                imprimir nome do arquivo
                nome = nome do arquivo [len (self.folder) +1:]
                self.archive.write (nome do arquivo, nome, arquivo zip.ZIP_DEFLATED)

    def run (próprio, pasta, nome, exclude_svn):
        self.exclude_svn = exclude_svn
        self.folder = pasta
        self.archive = zipfile.ZipFile (nome + ". zip", "w")
        os.path.walk (self.folder, ZipArchive.zip_it, self)
        self.archive.close ()

se __name__ == "__main__":
    if (len (sys.argv) == 1):
        print "pasta zipit de uso [nome] [svn: yes | não]"
    outro:
        nome = sys.argv [1]
        exclude_svn = False

        if (len (sys.argv)> 2): nome = sys.argv [2]
        if (len (sys.argv)> 3): exclude_svn = (sys.argv [3] == "não")

        arch = ZipArchive ()
        arch.run (sys.argv [1], nome, exclude_svn)
        imprimir "pronto"

luc
fonte
a questão é: pode ser descompactado usando o mecanismo de zip do Windows?
sim. Eu o abri com a ferramenta zip do Vista. Espero que funcione para você também
0

Provavelmente, há um problema na transferência de arquivos do Linux para o Windows. Se você estiver usando FTP, tente definir uma transferência binária (comando bin no Windows, antes da transferência de seus arquivos do Linux para o Windows).

Luis Andrés García
fonte
Discordo. Eu já tive problemas semelhantes aos do OP, principalmente nas versões antigas do Windows. Fiz verificações de integridade e a correspondência do shasum. Além disso, observe que o OP diz que os arquivos são descompactados corretamente em programas de terceiros.
Wowfunhappy