Como compactar vários arquivos em arquivos separados?

Como compactar vários arquivos em arquivos separados?

Admito que esta pergunta foi feita aqui antes:

ComoCompacte em arquivos separadosonde a pessoa que perguntou não especificou o sistema operacional que usou e não recebeu respostas.

Preciso separar um diretório enorme em vários arquivos .zip que não sejam interdependentes entre si. Então, em vez de:

arquivo1.zip
arquivo2.z01
arquivo3.z02

Gostaria do seguinte conjunto de arquivos:

arquivo1.zip
arquivo2.zip
arquivo3.zip

Basicamente esta é a minha pergunta. Estou no OS X, então um script de shell ou AppleScript seria o caminho mais fácil.

Além disso, aqui está um cara que perguntou a mesma coisa - só que ele queria criar um arquivo .tar: Como fazerCriando arquivos separados para um conjunto de arquivos

A resposta está correta, mas resultará em arquivos tar:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

PS: Esta última parte é só para vocês que estão aptos no Keyboard Maestro:

Também tentei fazer isso no Keyboard Maestro, tenho uma configuração de ação "para cada" que determina os caminhos dos arquivos e aciona um script de shell. A saída está correta e a macro funciona se eu colá-la no terminal (por exemplo zip /Users/me/Desktop/test /Users/me/Desktop/test.txt).

Porém, quando passo as duas variáveis ​​para o shell script no Keyboard Maestro não funciona:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

Responder1

A solução é muito fácil. Se você quiser fazer isso para cada arquivo, recursivamente, use find. Ele listará todos os arquivos e diretórios, descendo também para subdiretórios.

find . -type f -execdir zip '{}.zip' '{}' \;

Explicação:

  • O primeiro argumento é o diretório em que você deseja começar,.
  • Então iremos restringi-lo para encontrar apenas arquivos ( -type f)
  • A -execdiropção nos permite executar um comando sobre cada arquivo encontrado, executando-o a partir do diretório do arquivo
  • Este comando é avaliado como zip file.txt.zip file.txt, por exemplo, uma vez que todas as ocorrências de {}são substituídas pelo nome real do arquivo. Este comando precisa ser finalizado com\;

Claro, findtem mais opções. Se, em vez disso, você quiser apenas permanecer no diretório atual, sem descer para subdiretórios:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

Se você quiser restringi-lo a determinados tipos de arquivo, use a -nameopção (ou -inamepara correspondência sem distinção entre maiúsculas e minúsculas):

find . -type f -name "*.txt" …

Qualquer outra coisa (incluindo loop com fora saída de ls *) é uma sintaxe muito feia na minha opinião e provavelmente quebrará, por exemplo, em arquivos com espaços no nome ou devido a muitos argumentos.

informação relacionada