Se cada um dos elementos do arquivo for menor que o espaço livre, pode-se extrair cada arquivo individualmente, processá-los e depois removê-los. Algo parecido com isto:
foo.7z
contém 10 arquivos de tamanho arbitrário. Listar, extrair, deletar:
$ 7za l ../foo.7z Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2014-01-20 02:11:01 ....A 16885 189065 file.0 2014-01-20 02:11:01 ....A 40122 file.1 [...] $ 7za l ../foo.7z | awk '/^2014/ {print $NF}' | while read a; do 7za x ../foo.7z $a > /dev/null do-something-with $a rm -f $a done
Se houver apenas um arquivo grande no arquivo, pode-se tentar extrair para stdout e depois jogar com dd
:
7za a archive.7z one-big-file 7za x -so archive.7z 2>/dev/null | dd bs=1M count=100 2>/dev/null > part.1 7za x -so archive.7z 2>/dev/null | dd bs=1M count=100 skip=100 2>/dev/null > part.2 7za x -so archive.7z 2>/dev/null | dd bs=1M count=100 skip=200 2>/dev/null > part.3 [...]
... e assim por diante, até dd
não poder mais pular (e part.N
estará vazio).