5

Есть ли способ преобразовать файл .bz2 в файл .tar.bz2, не распаковывая все содержимое на диск, а затем повторно сжимая? Распакованный размер больше моего диска. Поскольку bz2 работает с блоками, может показаться, что вы можете просто распаковать блок, передать его по конвейеру, повторно сжать его, удалить распакованный блок из памяти и т.д.

Я спросил об этом на форумах Ubuntu и не нашел ответа.

2 ответа2

3

Обновление: мой оригинальный ответ не работает вообще, извините. tar не будет принимать поток данных из STDIN в качестве входных данных, поэтому первая команда не выполняется.

Единственный способ, которым я могу придумать, чтобы выполнить то, что вы хотите, - это написать собственную программу для добавления требуемых заголовков tar и тому подобного в ваш поток данных. Тогда вы могли бы написать:

$ bzcat foo.bz2 | stream-to-tar | bzip - > foo.tar.bz2

... и (при условии, что ваша программа правильно использует формат tar ) вы можете распаковать его с помощью стандартного tar xf foo.tar.bz2 .


Это, вероятно, не то, что вы хотите сделать, так как он не предоставляет никаких обычных преимуществ tar'а файла в первую очередь.

$ bzcat foo.bz2 | tar cjf foo.tar.bz2 -

Теперь проблема в том, что tar не включает в себя ни одну файловую систему, потому что все, что мы дали, это распакованный поток данных. Это означает, что вам нужно распаковать / распаковать его так:

$ tar --to-stdout -xjf foo.tar.bz2 > foo

0

Я думаю, вы найдете ответ: вы не делаете этого. Сжатие, полученное из файла .tbz2 сравнению с файлом .bz2 является довольно минимальным, если вы сжали его с помощью --best . Вот пример из журнала ошибок httpd:

 39M ./httpd-error.log
904K ./httpd-error.log.bz2
904K ./httpd-error.log.tbz2

В противном случае вам придется сделать это с остановкой у жесткого диска.

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