Como compactar vários arquivos em arquivos separados?

2

Admito que esta pergunta foi feita aqui antes:

Como Zipar em arquivos separados a pessoa que perguntou não especificou o SO que ele usou e não recebeu respostas.

I need to separate a huge directory into multiple .zip files that are not interdependent on each other. So, instead of:

file1.zip
file2.z01
file3.z02

I would like the following set of files instead:

file1.zip
file2.zip
file3.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 pediu a mesma coisa - só que ele queria criar um arquivo .tar: Como Criando 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

Qualquer ajuda com isso é apreciada.

PS: Esta última parte é apenas para aqueles que estão em forma no Keyboard Maestro:

Eu também tentei executar isso no Keyboard Maestro, eu tenho uma configuração de ação "para cada" que determina os caminhos de arquivo e, em seguida, dispara 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 ).

No entanto, quando eu passar as duas variáveis para o shell script no Keyboard Maestro não funcionará:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

Obrigado.

    
por pattulus 30.05.2012 / 08:00

1 resposta

13

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

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

Explicação:

  • O primeiro argumento é o diretório no qual você deseja iniciar, .
  • Em seguida, vamos restringi-lo para encontrar apenas os arquivos ( -type f )
  • A opção -execdir nos permite executar um comando em cada arquivo encontrado, executando-o a partir do diretório do arquivo
  • Esse comando é avaliado como zip file.txt.zip file.txt , por exemplo, pois todas as ocorrências de {} são substituídas pelo nome real do arquivo. Este comando precisa ser finalizado com \;

Claro, find tem mais opções. Se, em vez disso, você quiser apenas permanecer em seu diretório atual, não descer em subdiretórios:

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

Se você quiser restringi-lo a determinados tipos de arquivo, use a opção -name (ou -iname para correspondência que não diferencia maiúsculas de minúsculas):

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

Qualquer outra coisa (incluindo o loop com for sobre a saída de ls * ) é uma sintaxe bastante desagradável na minha opinião e é provável que quebre, por exemplo em arquivos com espaços em seu nome ou devido a muitos argumentos.

    
por 30.05.2012 / 08:15