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.z02Gostaria 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
-execdir
opçã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, find
tem 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 -name
opção (ou -iname
para correspondência sem distinção entre maiúsculas e minúsculas):
find . -type f -name "*.txt" …
Qualquer outra coisa (incluindo loop com for
a 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.