open - Mac zip compress sem pasta__MACOSX?




zip file mac terminal (9)

Quando eu comprimir arquivos com o compressor zip embutido no Mac OSX, isso resulta em uma pasta extra chamada "__MACOSX" criado no zip extraído.

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

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

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


É assim que evito o diretório __MACOSX ao compactar arquivos com o comando tar :

$ 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

Correr find . | xargs xattr -l find . | xargs xattr -l find . | xargs xattr -l novamente, certifique-se de que nenhum arquivo tenha o atributo xattr. então você está pronto para ir:

tar cjvf file.tar.bz2 dir


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

zip -d filename.zip "__MACOSX*"

Funciona melhor para mim


Este comando fez isso por mim:

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

Target.zip é o arquivo zip para criar. Source é o arquivo / pasta de origem para zipar. E o parâmetro _x especifica o arquivo / pasta a não incluir. Se o acima não funcionar por qualquer motivo, tente isso:

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

Eu estou usando este Automator Shell Script para consertá-lo depois. Está aparecendo como item de menu contextual (clicando com o botão direito em qualquer arquivo que aparece 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" no "Finder"
  3. Adicionar uma "Ação de Script da Shell"


O utilitário de linha de comando zip nunca cria um diretório __MACOSX , então você pode simplesmente executar um comando como este:

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

Na saída abaixo, a.zip que eu criei com o utilitário de linha de comando zip não contém um diretório __MACOSX , mas a 2.zip que 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_Store não exclui arquivos .DS_Store dentro de diretórios, mas -x \*.DS_Store faz.

O arquivo de nível superior de um arquivo zip com vários arquivos geralmente deve ser um único diretório, porque se não for, alguns utilitários de desarquivamento (como unzip e 7z , mas não o utilitário de arquivamento, o unarchiver, unar ou dtrx ) não criam um único diretório. contendo diretório para os 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 Archive Utility cria apenas um diretório __MACOSX quando você cria um archive em que pelo menos um arquivo contém metadados, como atributos estendidos, sinalizadores de arquivo ou uma bifurcação de recurso. O diretório __MACOSX contém arquivos AppleDouble cujo nome de arquivo começa com ._ que são usados ​​para armazenar metadados específicos do OS X. O utilitário de linha de comando zip descarta metadados como atributos estendidos, sinalizadores de arquivo e forks de recursos, o que também significa que metadados como tags são perdidos e aliases param de funcionar, porque as informações em um arquivo de alias são armazenadas em uma bifurcação de recurso.

Normalmente você pode simplesmente descartar os metadados específicos do OS X, mas para ver quais arquivos de metadados contêm, você pode usar xattr -l . xattr também inclui forquilhas de recursos e sinalizadores de arquivos, porque mesmo que eles não sejam realmente armazenados como atributos estendidos, eles podem ser acessados ​​através da interface de atributos estendidos. O Archive Utility e o utilitário de linha de comando zip descartam as ACLs.


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


Você não pode.

Mas o que você pode fazer é excluir essas pastas indesejadas após a compactação. O zip linha de comando usa argumentos diferentes, onde um, o -d , é para excluir o conteúdo com base em um regex. Então você pode usá-lo assim:

zip -d filename.zip __MACOSX/\*

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

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

Para o comando Compress 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 opções -c -k , cria arquivos zip. Com esta ferramenta, você pode experimentar com --norsrc , --noextattr , --noqtn , --noacl e / ou simplesmente deixar a opção --sequesterRsrc (que, de acordo com a página man, pode ser responsável pelo subdiretório __MACOSX ). Embora, talvez a ausência de --sequesterRsrc simplesmente signifique usar o formato AppleDouble, que criaria arquivos ._ em todo o lugar em vez de um diretório __MACOSX .


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

Além disso, você pode criar o Automator Service para facilitar o uso no Finder. Confira o link abaixo para ver detalhes, se precisar.

Github







zip