Если каждый из элементов архива меньше свободного места, можно было бы извлечь каждый файл по отдельности, обработать их, а затем удалить их. Что-то вроде этого:
foo.7z
содержит 10 файлов произвольного размера. Список, извлечение, удаление:
$ 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
Если в архиве только один большой файл, можно попробовать распаковать его в stdout, а затем играть в игры с помощью 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
[...]
... и так далее до тех пор, пока dd
не сможет пропустить больше (и part.N
будет пустым).