Como dividir um arquivo e compactar diretamente?

12

Eu tenho um arquivo de 100 GB e quero dividir em 100 de 1 GB cada (por quebra de linha)

por exemplo

split --bytes=1024M /path/to/input /path/to/output

Para os 100 arquivos gerados, quero aplicar o gzip / zip a cada um desses arquivos.

É possível usar um único comando?

Ryan
fonte
2
Para até 1 GB por arquivo (menos se a próxima linha o substituir), use --line-bytes=1024M.
26714 Brian

Respostas:

30

Use "--filter":

split --bytes=1024M --filter='gzip > $FILE.gz' /path/to/input /path/to/output

Pedro
fonte
isso não funciona para mim, continua substituindo o mesmo arquivo que $ FILE não está definido e nem grava na pasta des.
splaisan 16/09/19
meu erro, precisa de aspas simples para obter $ FILE substituído, meu grande erro, desculpas e obrigado pela ajuda: esse comando final funcionou para mim para salvar dados fastq que vêm em blocos de 4 linhas: 'zcat ERR3152365.fastq.gz | divisão -a 3 -d -l 1200000 --numeric-sufixos --filter = 'pigz -p 8> $ FILE.fq.gz' - splitout / part_'
splaisan
0

Um one-liner usando um condicional é o mais próximo possível.

cd /path/to/output && split --bytes=1024M /path/to/input/filename && gzip x*

gzipsó será executado se splitfor bem-sucedido por causa da condicional &&que também está entre cde também splitpara garantir que cdseja bem-sucedido. Observe que splite gzipgera para o diretório atual em vez de ter a capacidade de especificar o diretório de saída. Você pode criar o diretório, se necessário:

mkdir -p /path/to/output && cd /path/to/output && split --bytes=1024M /path/to/input/filename && gzip x*

Para juntar tudo novamente:

gunzip /path/to/files/x* && cat /path/to/files/x* > /path/to/dest/filename
Pausado até novo aviso.
fonte
0

O uso deste comando com a -dopção permite gerar sufixos numéricos.

split -d -b 2048m "myDump.dmp" "myDump.dmp.part-" && gzip myDump.dmp.part*

Arquivos gerados:

    myDump.dmp.part-00
    myDump.dmp.part-01
    myDump.dmp.part-02
    ...
Iván
fonte