Estou no Ubuntu 16.04.
Eu tenho uma pasta com muitos arquivos de texto (quase 12k). Preciso fazer o upload de todos eles para um site que aceite .tar.gz
envios e descompacte-os automaticamente, mas tem um limite de 10 MB (10000 KB) por arquivo (portanto, cada arquivo deve ser descomprimido por conta própria). Se eu tar.gz
todos esses arquivos, o arquivo resultante é de cerca de 72MB.
O que eu gostaria de fazer é criar oito .tar.gz
arquivos, cada um de tamanho / dimensão (estritamente) menor que 10000 KB.
Como alternativa, pode-se supor que todos os arquivos acima tenham aproximadamente a mesma dimensão, então eu gostaria de criar oito .tar.gz
arquivos com mais ou menos a mesma quantidade de arquivos cada.
Como posso executar qualquer uma dessas duas tarefas?
Estou perfeitamente bem com uma solução que envolve GUI, CLI ou script. Não estou procurando velocidade aqui, só preciso fazê-lo.
fonte
tar
adicioná-los adicionando todos os arquivos começando com um determinado padrão até ter todos eles. Isso pode ser facilmente roteirizado, mas não garante que o tamanho seja menor que 9 MB, conforme necessário. No entanto, você pode ajustar manualmente o tamanho dos arquivos muito grandes, dividindo-os ainda mais.Respostas:
Totalmente patchwork e um esboço rápido e atual, mas testado em um diretório com 3000 arquivos, o script abaixo fez um trabalho extremamente rápido:
Como usar
compress_split.py
Execute-o com o diretório com seus arquivos como argumento:
os
.tar.gz
arquivos numerados serão criados no mesmo diretório em que os arquivos estão.Explicação
O script:
EDITAR
Criar automaticamente pedaços por tamanho em mb
Mais sofisticado é usar o tamanho máximo (em mb) dos blocos como argumento (segundo). No script abaixo, os pedaços são gravados em um arquivo compactado assim que o pedaço atinge (passa) o limite.
Como o script é acionado pelos blocos, excedendo o limite, isso funcionará apenas se o tamanho dos arquivos (todos) for substancialmente menor que o tamanho do bloco.
O script:
Para correr:
... onde chunksize é o tamanho da entrada para o comando tar.
Neste, as melhorias sugeridas pelo @DavidFoerster estão incluídas. Graças muito !
fonte
tar
ainda mais a chamada fornecendo a lista de arquivos no fluxo de entrada padrão.tar
permite especificar arquivos para adicionar (ou extrair) na entrada padrão com uma opção apropriada.Uma abordagem pura do shell:
Explicação
files=(*)
: salve a lista de arquivos (também diretórios, se houver algum, alterefiles=(*.txt)
para obter apenas itens com umatxt
extensão) na matriz$files
.num=$((${#files[@]}/8));
:${#files[@]}
é o número de elementos na matriz$files
. A$(( ))
é a maneira do bash (limitada) de fazer aritmética. Portanto, esse comando define$num
o número de arquivos dividido por 8.k=1
: apenas um contador para nomear os tarballs.for ((i=0; i<${#files[@]}; i+=$num)); do
: itere sobre os valores da matriz.$i
é inicializado em0
(o primeiro elemento da matriz) e incrementado por$num
. Isso continua até passarmos por todos os elementos (arquivos).tar cvzf files$i.tgz -- ${files[@]:$i:$num}
: no bash, você pode obter uma fatia da matriz (parte de uma matriz) usando${array[@]:start:length}
, Então${array[@]:2:3}
retornará três elementos a partir do segundo. Aqui, estamos pegando uma fatia que começa no valor atual de$i
e possui$num
elementos. Isso--
é necessário caso qualquer um dos seus nomes de arquivos possa começar com a-
.((k++))
: incremento$k
fonte