6

Дилемма: у меня есть архив на 10 ГБ и жесткий диск на 20 ГБ. Когда я иду, чтобы распаковать / разархивировать файл, жесткий диск заполняется, и процесс завершается неудачей.

Вопрос: На Ubuntu Server 12.04 / Linux есть ли способ разархивировать файл при уменьшении размера архива?

3 ответа3

6

Вот еще одно решение. Он не позволит вам извлекать отдельные файлы из архива и уменьшать его размер, но он позволяет вам извлекать все файлы, уменьшая размер архива на ходу:

#!/bin/sh

# $1, the first paramter, is the .tar.gz file to unarchive

(
    size=$(wc -c $1)
    offset=0
    bs=4096
    while [[ $size > $offset ]]; do
        dd if=$1 bs=$bs count=1 skip=$offset status=none
        fallocate -p -o $offset -l $bs $1
        offset=$(( $offset + $bs ))
    done
) | tar xz

Сохраните это в файл, например, например, untar_and_destroy.sh и выполните как:

untar_and_destroy.sh whatever.tar.gz

Для этого нужно передать часть файла .tar.gz в tar, попросить Linux освободить эту часть файла, а затем повторить для следующей части. Когда вы закончите, ls -l скажет, что файлы .tar.gz имеют тот же размер, что и раньше, но du сообщит о его размере как 0. Это связано с тем, что файл .tar.gz был преобразован в разреженный файл той же длины, что и раньше, но со всеми нулями, которые не нужно хранить на диске.

Не используйте это в производстве, или где-нибудь, где удаление этого архива было бы плохо. Это делает архив нечитаемым, как только он запускается, поэтому, если что-то пойдет не так, например, если у вас не хватает места на жестком диске во время извлечения, у вас не будет второго шанса запустить это.

2

Хотя расширение основного хранилища может быть нецелесообразным, возможно, вы могли бы извлечь содержимое файла на внешнее устройство хранения.

Или создайте список файлов в архиве, а затем напишите сценарий, который извлекает некоторые из них. Переместите эти файлы в облако, выберите другую партию, чтобы извлечь, вспенить, промыть, повторить.

Но каждое архивное приложение, о котором я знаю, должно иметь неповрежденный исходный архивный файл, в то время как оно создает новый архивный файл без того, что вам не нужно, поэтому внешнее хранилище будет очень и очень полезным.

2

Я не знаю каких-либо инструментов, которые могут это сделать, и я не думаю, что какой-либо из распространенных форматов архивации поддерживает это.

Одним из возможных решений вашей проблемы может быть сохранение архива на другом компьютере и передача его на тот компьютер, на котором вы хотите распаковать его. Например, вы можете запустить эту команду на компьютере с архивом:

cat archive.tar.gz | ssh YOUR_SERVER tar xfz -

Архив будет передан процессу tar работающему на сервере, который распакует его без необходимости присутствия архива на сервере.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .