Compactar em lote várias pastas em arquivos zip individuais

12

Tenho dezenas de pastas que preciso compactar em arquivos zip individuais.

Se eu selecionar todas essas pastas no Finder e fizer "Compactar [X] Itens", recebo um arquivo zip contendo todas as pastas, enquanto o que eu quero é um arquivo zip por pasta.

Tentei criar um fluxo de trabalho com o Automator usando a ação "Criar arquivo", mas se comporta da mesma maneira: a entrada de vários arquivos / pastas gera um único arquivo zip. Não há como especificar que a ação seja executada em cada item individualmente.

Basicamente, estou procurando uma maneira de evitar a execução entediante de "Compress" no Finder em todas as pastas, uma de cada vez. Existe alguma maneira de automatizar isso?

daGUY
fonte
11
Atualizei minha resposta para melhorar o código usado para incrementar o nome do arquivo compactado, emulando como o comando Compactar [n] itens do menu de contexto do Finder incrementa um nome de arquivo.
user3439894
Desculpe, atualizei o código novamente para remover o popderro de digitação desnecessário e corrigido for i in $bn*.zip; do, o que deveria ter acontecido for i in $bn *.zip; do. Observe o espaço entre $bne *.zip, ele estava ausente e não deveria estar. Portanto, atualize-o em sua implementação, caso contrário, ele será ativado File Name 2.zipquando basenamehouver um espaço nele.
user3439894

Respostas:

14

Aqui está um Serviço de Automator 1 que fica disponível no Finder quando as Pastas são selecionadas e emula o comando Compactar [n] Itens dos menus de contexto, exceto que ele cria um arquivo zip individual para cada Pasta selecionada no nome da Pasta selecionada . Se o arquivo Folder.zip Name já existir, um ( espaço 2) será anexado ao nome do arquivo , por exemplo, Folder Name 2.zip . Isso garante um arquivo zip existente " 2"não é tocado e o nome do arquivo compactado será automaticamente incrementado conforme necessário.

1 No macOS Mojave e, posteriormente, um Serviço do Automator é chamado de Ação rápida . Existem também outras pequenas diferenças na nomenclatura, mas elas devem ser mais óbvias ao compará-las aos fluxos de trabalho anteriores ao macOS Mojave Automator.

Para criar o serviço: 1

  1. Abra o Automator e selecione Serviço 1 ou Arquivo > Novo > Serviço Se o Automator já estiver aberto.

  2. Set serviço recebe selecionado para pastas e na de localizador .

  3. Adicione uma ação Executar script do shell , configurando Shell: para / bin / bash e Passar entrada: para como argumentos e adicione o seguinte código :

    for f in "$@"; do
    
        dn="$(dirname "$f")"
        bn="$(basename "$f")"
    
        cd "$dn" || exit
    
        if [[ ! -e "$bn.zip" ]]; then
            ditto -c -k --sequesterRsrc --keepParent "$f" "$bn.zip"
        else
            n=2
            for i in $bn *.zip; do
                if [[ "$bn $n.zip" == "$i" ]]; then
                    n="$(( n + 1 ))"
                fi
            done
            ditto -c -k --sequesterRsrc --keepParent "$f" "$bn $n.zip"
        fi
    
    done
    
    afplay /System/Library/Sounds/Purr.aiff
    
  4. Salve o serviço como: Compactar pastas separadamente

Para usar o serviço:

No Finder ou na área de trabalho, selecione várias pastas , clique com o botão direito do mouse e selecione Compactar pastas separadamente em Serviços .

Ou depois de selecionar as pastas de destino , você também pode clicar em Localizador > Serviços > Compactar pastas separadamente na barra de menus .

Aí está, uma maneira de compactar várias pastas separadamente e simultaneamente em arquivos zip individuais, enquanto emula como o Finder cria um arquivo zip. Significando que o arquivo zip contém garfos de recursos preservados e metadados HFS no subdiretório __MACOSX e incorpora apenas a origem do nome do diretório pai no arquivo de destino , não o nome do caminho completo como ao usar zip(sem -j) para criar o arquivo.

Imagem de compactar pastas separadamente

Compactar pastas separadamente - Serviço de Automator

user3439894
fonte
Eu verifiquei a sua solução e a @ ababak. Eles dão exatamente o mesmo resultado e o ababak's é muito mais fácil de implementar. Eu votei nos dois de qualquer maneira.
turzifer
15

Existe uma solução alternativa incorporada, se você não quiser usar o Automator e não terá problemas em alterar as configurações do Archive Utility.

  1. Abra o Archive Utility.app localizado em / Sistema / Biblioteca / CoreServices / Applications /
  2. Vá para Arquivo> Preferências
  3. Altere a preferência "Usar formato de arquivo morto" para "Arquivo compactado"
  4. Arraste e solte as pastas em seu ícone no dock.
ababak
fonte
o bom dessa opção é que você pode definir as preferências do Archive Utility.app para mover o original para a lixeira após a conclusão, não se limitando a pastas. Existe uma maneira de configurar um serviço do Automator para abrir com o Archive Utility.app como um serviço, se você quiser clicar com o botão direito do mouse como opção? Corri para uma limitação, pois o Archive Utility.app não pode ser selecionado usando a ação Iniciar aplicativo.
thepen
@thepen, é claro que você pode selecionar o Utilitário de Arquivamento como a Ação de Inicialização do Aplicativo. Você só precisa selecionar "Other ..." e navegue até sua localização que é /System/Library/CoreServices/Applications/(você pode pressionar Command-Shift-G quando a caixa de diálogo Selecionar arquivo está aberto para colar esse caminho para navegação rápida)
ababak
qual é a diferença entre 'formato de arquivo' e 'arquivo zip'?
user1993 20/01
Este método é um fluxo de trabalho muito mais fácil. Eu tentei o comando: para o item em *; zip "$ {item} .zip" "$ {item}"; feito no terminal, mas não funcionou direito. Desconhecia o porquê, mas eu não queria ter tempo para descobrir. Isso funcionou muito bem.
ArchonOSX