Распаковать ZIP-архив, не имея достаточного свободного места на диске

Имеется сервер на Ubuntu. На нём свободно 30 GB. В одной из его директорий находится ZIP-архив размером 70 GB. В архиве 4 млн. изображений, находящихся в разных папках. Степень сжатия небольшая и в распакованном виде данные поместятся на сервер.

Как можно распаковать архив?

Мне удалось найти скрипт, который использует fallocate для уменьшения количества занимаемых файлом блоков в процессе распаковки. Но часть системных вызовов заканчивается неудачей, а распаковка файлов этим способом по подсчётам займёт 4 дня. Пока что не рассматриваю этот вариант.


Ответы (1 шт):

Автор решения: Pak Uula

UPD Да, вариант отпал. zip -d создаёт копию исходного архива, поэтому требуется удвоенное пространство на диске, чтобы этот рецепт сработал.

Почему бы вам не попробовать извлекать файлы в режиме "извлёк-удалил"?

#!/bin/bash
ARCHIVE=test.zip
echo -n "DEBUG: space used: "; du -s . # DEBUG

last="$(zipinfo -1 $ARCHIVE | tail -1)"
while [ "$last" != "Empty zipfile." ]; do
        unzip -o "$ARCHIVE" "$last"
        zip -d "$ARCHIVE" "$last"
        echo -n "DEBUG: space used: "; du -s . # DEBUG
        last="$(zipinfo -1 $ARCHIVE | tail -1)"
done

Скрипт берёт последний файл из списка файлов в архиве, извлекает этот файл и удаляет извлечённый файл из архива. Так как удаляется файл из хвоста архива, то архив точно сжимается на диске.

Для проверки я сгенерировал семь случайных бинарных файла по 4 мб размером, упаковал их в архив и распаковал этим скриптом.

DEBUG: space used: 57352        .
Archive:  test.zip
  inflating: samples/7.bin
deleting: samples/7.bin
DEBUG: space used: 57352        .
Archive:  test.zip
  inflating: samples/6.bin
deleting: samples/6.bin
DEBUG: space used: 57352        .
Archive:  test.zip
  inflating: samples/5.bin
deleting: samples/5.bin
DEBUG: space used: 57348        .
Archive:  test.zip
  inflating: samples/4.bin
deleting: samples/4.bin
DEBUG: space used: 57348        .
Archive:  test.zip
  inflating: samples/3.bin
deleting: samples/3.bin
DEBUG: space used: 57348        .
Archive:  test.zip
  inflating: samples/2.bin
deleting: samples/2.bin
DEBUG: space used: 57348        .
Archive:  test.zip
  inflating: samples/1.bin
deleting: samples/1.bin
DEBUG: space used: 57344        .
Archive:  test.zip
deleting: samples/
        zip warning: zip file empty
DEBUG: space used: 57344

Видно, что по мере распаковки размер папки не увеличивается.

→ Ссылка