Mac zip compress sem pasta __MACOSX?

158

Quando comprimo arquivos com o compressor zip incorporado no Mac OSX, resulta em uma pasta extra intitulada "__MACOSX" criada no zip extraído.

Posso ajustar minhas configurações para impedir que esta pasta seja criada ou preciso comprar uma ferramenta de compactação de terceiros?

ATUALIZAÇÃO : Acabei de encontrar um aplicativo gratuito para OSX que resolve meu problema: " YemuZip "

ATUALIZAÇÃO 2 : YemuZip não é mais freeware

Scott B
fonte
A existência da pasta _MACOSX não cria nenhum problema. Simplesmente exclua-o.
Jayprakash Dubey
1
Esta questão parece ser off-topic, porque ele deve estar em AskDifferent
Nakilon
11
Ele cria um problema com serviços web exigentes que exigem um arquivo zip intocada, então eu sou grato pelas explicações
MCCC
21
@JayprakashDubey É incredibily irritante, e como um usuário linux que gosta de não deixar lixo em todos os lugares que eu vá, eu não suporto __MACOSX, .DS_Store, ._fileName, e todas as outras merdas variados Mac OS cai em seus arquivos. O `tar 'da OSX faz isso também - em flagrante desrespeito ao princípio do mínimo espanto .
Wyatt8740

Respostas:

80

Quando tive esse problema, fiz na linha de comando:

zip file.zip uncompressed

EDIT , depois de muitas votações negativas: eu estava usando essa opção há algum tempo e não sei onde aprendi, então não posso lhe dar uma explicação melhor. Chris Johnson resposta está correta, mas não vou apagar minha. Como um comentário diz, é mais preciso o que o OP está pedindo, pois é compactado sem esses arquivos, em vez de removê-los de um arquivo compactado. Também acho mais fácil lembrar.

sinuhepop
fonte
33
Isso não tem explicação.
Raptor
2
O subdiretório __MACOSX / contém garfos de recursos do Mac e é criado quando você usa as ferramentas do Mac para criar o arquivo zip. Da mesma forma, as ferramentas do Mac consumirão o subdiretório __MACOSX / para definir garfos de recursos e você nunca o verá. No entanto, se você usar as ferramentas do Mac para criar o arquivo zip e algumas outras ferramentas para descompactá-lo, obterá o diretório __MACOSX / e não os garfos de recursos. Se você criar o arquivo com zipum aplicativo de terceiros, o diretório __MACOSX / nunca será criado.
Edward Falk
Veja minha resposta para uma maneira fácil de excluir a pasta _MACOSX após a criação do arquivo zip.
Chris Johnson
3
Para compactar um diretório recursivamente sem o __MACOSX e outros:zip -rX file.zip uncompressed_directory
Konstantin Suvorov
319

Pode ser corrigido após o fato por zip -d filename.zip __MACOSX/\*

Chris Johnson
fonte
51
também apagar arquivos .DS_Store:zip -d filename.zip \*/.DS_Store
Benedikt Köppel
5
A resposta aceita diz como não obter o diretório __MACOSX / em primeiro lugar, mas não diz nada sobre o que fazer com um arquivo .zip existente. Esta resposta diz como se livrar do __MACOSX / se você já o tiver. No entanto, a pergunta original era como não obtê-la em primeiro lugar, portanto a resposta aceita é a correta.
Edward Falk
Como posso fazer isso recursivamente para todos os arquivos zip?
Wowfunhappy
Para aplicar a todos os arquivos zip sob alguma raiz: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Substitua seu ponto de partida por ~.
Chris Johnson
Uma função para remover todos os arquivos inúteis: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Uso: cleanzip file.zipou cleanzip file.zip MORE_JUNK_FILES(segundo parâmetro é opcional)
mrdaliri
56

Dentro da pasta que você deseja compactar, no terminal:

zip -r -X Archive.zip *

Onde -X significa: exclua os arquivos de recursos invisíveis do Mac, como "_MACOSX" ou "._Filename" e .ds armazenam arquivos

fonte

Nota: Funcionará apenas para a pasta e a árvore de pastas subsequente em que você está e precisa ter o *curinga.

pompalini
fonte
9
Isso não funciona como você pensa: -Xnão exclui arquivos .DS_Store. A razão pela qual isso pode funcionar para o seu aplicativo é que você está apenas compactando *, que é um curinga que corresponde aos arquivos que não começam com ".". Experimente em um diretório que contém um arquivo de ponto e você verá que ele é incluído.
spinup
Veja minha resposta para uma maneira fácil de excluir a pasta _MACOSX após a criação do arquivo zip.
Chris Johnson
1
Não zip -r -X Archive.zip myfolder. A execução de uma pasta ainda resulta em um arquivo zip contendo o arquivo .DS_Store.
Rockallite 11/03/16
@Rockallite: você está correto, isso só funcionará quando você compactar as pastas, árvores ou arquivos na pasta em que está. Portanto, você não pode passar uma pasta como argumento ou ela não funcionará conforme o esperado, apenas com o curinga * funciona.
Pompalini
Isso funciona para arquivos dentro de diretórios, em vez de compactar uma pasta completa.
Michael Trouw
26

Este comando fez isso por mim:

zip -r Target.zip Source -x "*.DS_Store"

Target.zipé o arquivo zip a ser criado. Sourceé o arquivo / pasta de origem a ser compactado. E o _xparâmetro especifica o arquivo / pasta a não incluir. Se o exposto acima não funcionar por qualquer motivo, tente o seguinte:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Adil Hussain
fonte
O OP perguntou como excluir a pasta __MACOSX. Seu primeiro trecho de código obviamente não funciona, porque não o nomeia como uma pasta a ser excluída.
Chris Johnson
7
O ziputilitário de linha de comando nunca cria um __MACOSXdiretório, portanto, o primeiro trecho funciona e a -x "__MACOSX"parte não é necessária.
Nisetama
15

Estou usando esse Script do Shell do Automator para corrigi-lo depois. Ele aparece como item de menu contextual (clique com o botão direito do mouse em qualquer arquivo exibido no Finder).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Crie um novo serviço com o Automator
  2. Selecione "Arquivos e pastas" em "Localizador"
  3. Adicione uma "ação de script de shell"

script de shell do automator

item de menu contextual no Finder

benedikt
fonte
Não seria melhor fazer a compactação usando o zip no Script Shell do Automator, em vez de compactar usando o built-in da Apple e remover arquivos indesejados?
30517 Matt
@ Matt, você pode adicionar a etapa de arquivamento no automator ou usar outro comando do shell também.
Tdimasdf
@Matt também, a Apple interna lida com a nomeação automática de arquivos e o incremento de nomes quando o arquivo existe. Com o shell script, essa parte seria muito trabalhosa.
precisa
1
Ele gera um erro se a pasta .DS_Store não estiver presente no arquivo morto. Sugiro uma melhoria adicionando `|| true` após cada comando zip (como zip -d "$p" __MACOSX/\* || trueem sua resposta.
adamsfamily
1
Enquanto as outras respostas são boas, eu gosto mais desta porque pode ser usada de uma maneira muito Macish.
precisa saber é o seguinte
10

As pastas indesejadas também podem ser excluídas da seguinte maneira:

zip -d filename.zip "__MACOSX*"

Funciona melhor para mim

SabU
fonte
8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ignore __MACOSX como você mencionou.
  • -x "*/\.*": ignore qualquer arquivo oculto, como .DS_Store.
  • Cite a variável para evitar o arquivo, se for nomeado com SPACE.

Além disso, você pode criar o Serviço Automator para facilitar o uso no Finder. Verifique o link abaixo para ver detalhes, se necessário.

Github

Jian Jason
fonte
Heh, a única resposta correta entre um mar de lixo, também é o que tem menos votos. / suspiro
Heath Raftery
Funcionou para mim, mas tive que remover as aspas e o símbolo do dólar antes de destFileName.zip e srcFileName
Alexander Poleschuk
3

O ziputilitário de linha de comando nunca cria um __MACOSXdiretório; portanto, você pode simplesmente executar um comando como este:

zip directory.zip -x \*.DS_Store -r directory

Na saída abaixo, a.zipque eu criei com o ziputilitário de linha de comando não contém um __MACOSXdiretório, mas a 2.zipque eu criei no Finder.

$ touch a
$ xattr -w somekey somevalue a
$ zip a.zip a
  adding: a (stored 0%)
$ unzip -l a.zip
Archive:  a.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
 --------                   -------
        0                   1 file
$ unzip -l a\ 2.zip # I created `a 2.zip` from Finder before this
Archive:  a 2.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
        0  01-02-16 20:31   __MACOSX/
      149  01-02-16 20:29   __MACOSX/._a
 --------                   -------
      149                   3 files

-x .DS_Storenão exclui .DS_Storearquivos dentro de diretórios, mas -x \*.DS_Storesim.

O arquivo de nível superior de um archive zip com vários arquivos geralmente deve ser um diretório único, porque, caso contrário, alguns utilitários de desarquivamento (como unzipe 7z, mas não o Archive Utility, The Unarchiver unaroudtrx ) não criam um diretório que contenha o arquivos quando o arquivo é extraído, o que geralmente dificulta a localização dos arquivos e, se vários arquivos como esse são extraídos ao mesmo tempo, pode ser difícil dizer quais arquivos pertencem a qual arquivo.

O Utilitário de arquivamento cria apenas um __MACOSXdiretório quando você cria um arquivamento em que pelo menos um arquivo contém metadados, como atributos estendidos, sinalizadores de arquivo ou uma bifurcação de recursos. O __MACOSXdiretório contém arquivos AppleDouble cujo nome de arquivo é iniciado e ._são usados ​​para armazenar metadados específicos do OS X. O ziputilitário de linha de comando descarta metadados, como atributos estendidos, sinalizadores de arquivo e bifurcações de recursos, o que também significa que os metadados, como tags, são perdidos e que os alias param de funcionar, porque as informações em um arquivo de alias são armazenadas em uma bifurcação de recursos.

Normalmente, você pode simplesmente descartar os metadados específicos do OS X, mas para ver o que os arquivos de metadados contêm, você pode usá-lo xattr -l. xattrtambém inclui bifurcações de recursos e sinalizadores de arquivo, porque, embora não sejam realmente armazenados como atributos estendidos, eles podem ser acessados ​​através da interface de atributos estendidos. O Archive Utility e o ziputilitário de linha de comando descartam ACLs.

nisetama
fonte
Isso funciona apenas para diretórios, não para um monte de arquivos dentro de um diretório.
Michael Trouw
@MichaelTrouw Sim, mas em geral você não deve criar um arquivo que contenha vários arquivos no nível superior.
Nisetama
Concordo em discordar porque há casos de uso em que isso é bom. Por exemplo, aquele em que o usuário final de um arquivo zip nunca será um usuário. Mas um servidor.
Michael Trouw
3

Você não pode.

Mas o que você pode fazer é excluir as pastas indesejadas após o fechamento. A linha de comando zipusa argumentos diferentes, onde um deles -dé para excluir o conteúdo com base em uma regex. Então você pode usá-lo assim:

zip -d filename.zip __MACOSX/\*
Alejandro Pablo Tkachuk
fonte
2

não compactar nenhum arquivo oculto:

zip newzipname filename.any  -x "\.*"

com esta pergunta, deve ser como:

zip newzipname filename.any  -x "\__MACOSX"

Deve-se dizer, porém, o comando zip é executado no terminal apenas compactando o arquivo, ele não comprime nenhum outro. Então faça isso o resultado é o mesmo:

zip newzipname filename.any
Xian Shu
fonte
__MACOSXnão começa com.
PJMeisch 9/17
sim, eu cometi um erro. Foi modificado. Obrigado por me lembrar
Xian Shu
1

Você quer dizer a zipferramenta de linha de comando ou o comando Compressor do Finder?

Para zip, você pode tentar a --data-forkopção. Se isso não funcionar, você pode tentar --no-extra, embora isso pareça ignorar outros metadados de arquivo que podem ser valiosos, como uid / gid e tempo de arquivo.

Para o comando Compressor do Finder, não acredito que haja opções para controlar seu comportamento. É para o caso simples.

A outra ferramenta, e talvez a que o Finder realmente usa sob o capô, é ditto. Com as -c -kopções, ele cria arquivos zip. Com esta ferramenta, você pode experimentar com --norsrc, --noextattr, --noqtn, --noacle / ou simplesmente deixar de fora a --sequesterRsrcopção (que, de acordo com a página do manual, podem ser responsáveis para o __MACOSXsubdiretório). Embora, talvez a ausência de --sequesterRsrcsimplesmente signifique usar o formato AppleDouble, o que criaria arquivos ._ em todo o lugar, em vez de um __MACOSXdiretório.

Ken Thomases
fonte
1
Sim, estou me referindo ao utilitário "Compress" do localizador. Como é, eu estou recebendo uma pasta cheia de ._ arquivos que estraga WordPress' aparência / editor
Scott B
1

Eu tenho uma solução melhor depois de ler todas as respostas existentes. Tudo poderia ser feito por um fluxo de trabalho em um único clique direito. NENHUM software adicional, NENHUM material de linha de comando complicado e NENHUM truque de shell.

O fluxo de trabalho do automator:

  • Entrada: arquivos ou pastas de qualquer aplicativo.
  • Etapa 1: Criar arquivo morto, o sistema embutido com os parâmetros padrão.
  • Etapa 2: Execute o comando Shell, com entrada como parâmetros. Copie o comando abaixo.

    zip -d "$@" "__MACOSX/*" || true

    zip -d "$@" "*/.DS_Store" || true

Salve e pronto! Clique com o botão direito do mouse na pasta ou na maioria dos arquivos e escolha o fluxo de trabalho no menu Serviços. O arquivo sem metadados será criado ao lado.

Amostra

ttimasdf
fonte
0

É assim que evito o __MACOSXdiretório ao compactar arquivos com o tarcomando:

$ cd dir-you-want-to-archive $ find . | xargs xattr -l # <- list all files with special xattr attributes ... ./conf/clamav: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/global: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/web_server: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55

Exclua o atributo primeiro:

find . | xargs xattr -d com.apple.quarantine

Execute find . | xargs xattr -lnovamente, verifique se nenhum arquivo possui o atributo xattr. então você está pronto para ir:

tar cjvf file.tar.bz2 dir

Zhang Huangbin
fonte