Compacte muitos arquivos em vários arquivos

13

Executando Linux. Eu tenho um diretório de cerca de 150 arquivos CSV grandes; simplesmente fazer um trabalho zip -9neles resulta em um arquivo monolítico ainda muito grande. Gostaria que simplesmente os compactasse em quatro ou cinco arquivos zip de 30 a 40 CSVs cada; dessa forma, o seqüenciamento ou a ordem de zip estendida não será um problema, pois cada zip é independente. Deve haver uma maneira simples de fazer isso. Alguma sugestão?

(e sim, zip é o formato preferido, se possível)

Mundos sem fim
fonte

Respostas:

23

-S não é suficiente? Você pode usar zip -s para dividir o arquivo em arquivos de tamanho máximo, por exemplo:

"zip -s 300m <arquivo de 2 GB>" produz:

file.zip (300 mb, master file)
file.001.zip (300 mb)
file.002.zip (300 mb)
file.003.zip (300 mb)
file.004.zip (300 mb)
file.005.zip (300 mb)
file.006.zip (200 mb)

Em seguida, "descompactar arquivo.zip" descompactará tudo juntos.

ranisalt
fonte
Que versão do zip é essa ?? Recebo file.z01 file.z02 ... file.zip e unzip file.zipnão funciona diretamente (eu usaria o zip -F para recombiná-los primeiro). Observe que eles não são "independentes", conforme solicitado.
sourcejedi
1
@sourcejedi: Nesta resposta ( superuser.com/a/602736/195224 ) estão algumas explicações mais detalhadas.
Mpy #
@py, eu sei, acabei de escrever essa resposta :).
sourcejedi
@sourcejedi: Oh sim, agora você diz que ...;)
mpy
2

Use split na lista de arquivos de entrada :-).

(Não testado, incluí comandos rm para limpeza, tome cuidado).

ls *.csv > csvfiles
split -d -l30 - csvfiles < csvfiles
for i in csvfiles[0-9][0-9]; do
  zip "$i.zip" -@ < "$i"
done

rm csvfiles
rm csvfiles[0-9][0-9]
sourcejedi
fonte
Por que você usa split -C( --line-bytes) e não split -l( --lines)? Isso seria mais previsível, com relação à quantidade de arquivos CSV em um arquivo morto.
Mpy
Eu olhei a página de manual muito rapidamente. Obrigado, eu vou consertar!
sourcejedi