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

46

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

Ele é aberto com êxito com o WinRar ou o Winzip, mas os dos meus usuários que estão usando a falha de experiência de tratamento de arquivos zip padrão do Windows ao tentar descompactá-lo. (Windows XP)

Eu compactei os mesmos dados usando o mecanismo de 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?

    
por studiohack 10.07.2009 / 12:40

8 respostas

26

Experimente:

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 Armazena links simbólicos como tal no arquivo zip, em vez de compactar e armazenar o arquivo referido pelo link
  • -r Viaja a estrutura de diretórios de forma recursiva
  • -q modo silencioso
por 10.11.2011 / 18:15
11

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

Eu recomendo strongmente com base na versão do Windows.

Ele suporta

packing / unpacking: 7z, ZIP, GZIP, BZIP2 and TAR

Unpacking only: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR and Z.

    
por 16.07.2009 / 11:43
8

zip -Z define a opção de compactação. -Z store é o mais trivial, pois não é comprimido. Isso é útil quando você usa zip como uma alternativa para tar ou quando soluciona problemas. Nesse caso, você deve tentar verificar se um arquivo descompactado pode ser usado no Windows. Se esse é utilizável, você sabe que terá que escolher uma opção de compactação não padrão.

    
por 10.07.2009 / 15:29
7

A única coisa que parece relevante é isso

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

    
por 10.07.2009 / 13:15
4

Além do que os outros sugeriram, é importante prestar Atenção aos seus nomes de arquivos e diretórios pois o Windows não necessariamente gosta do caminho e dos nomes dos arquivos do Linux. Às vezes também escapa-los de forma diferente quando se fecha. Exemplos são numerosos, mas o mais importante arquivos de pontos (. E ..), arquivos com apenas diferenças de casos (name.txt e NAME.txt), caminhos de arquivos absolutos (/tmp/file.txt) . Alguns outros caracteres que são permitidos em nomes de arquivos no Windows podem causar problemas quando o Windows Explorer é usado para abrir arquivos. No meu caso, ':' o personagem foi o disjuntor do negócio, mas precisou de muito trabalho para descobrir isso.

Portanto, antes de retomar o uso de muitos parâmetros, sugiro seguir um procedimento simples:

  1. Localize a pasta ou arquive sua compactação.

  2. execute: zip -9 -r -k zip-modified-names.zip / caminho / para / sua / pasta

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

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

A opção -k também pode tornar seus nomes de 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 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. Eu, portanto, mudei os nomes para 10_55_39.pdf que é aberto no Windows sem usar a opção -k, mas ainda é legível.

    
por 19.06.2015 / 07:50
3

Teve um problema semelhante recentemente com arquivos produzidos a partir de um script perl. Descobriu que o zip nativo do Windows (testado apenas no Windows 7) manipula incorretamente os caminhos com uma barra inicial e exibe um arquivo zip vazio. A solução foi despir a barra antes de adicionar arquivos. Talvez algumas versões do comando zip do linux armazenem caminhos de arquivos com barras iniciais.

    
por 24.04.2012 / 06:37
1

Aqui está um script python que estou usando para zipar alguns arquivos. Foi testado no Ubuntu e no Vista. Um zip gerado no Ubuntu abre 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. Eu vou verificar isso.

Espero que ajude

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"

    
por 10.07.2009 / 14:03
0

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

    
por 21.12.2012 / 11:46