Linux - Есть ли способ конвертировать файлы .bz2 в файлы .tar.bz2, используя каналы?

1641
endolith

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

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

5
Зачем тебе это делать? matpie 14 лет назад 4
Первоначально это была работа с очень большими файлами данных без их распаковки. archivemount позволяет вам монтировать .tar.bz2 (потому что он имеет «файловую систему» ​​внутри), но не .bz2. endolith 14 лет назад 0
http://sourceforge.net/apps/mediawiki/fuse/index.php?title=ArchiveFileSystems endolith 14 лет назад 0

2 ответа на вопрос

3
quack quixote

Обновление: мой оригинальный ответ не работает вообще, извините. 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 

какая это версия tar? не работает с GNU tar 1.16.1. goldPseudo 14 лет назад 0
GNU tar 1.20 для Debian, 1.21 для Cygwin. хмм. вы правы, первая команда не работает. tar sez `tar: -: не может быть стат: нет такого файла или каталога`. это, кажется, не нравится STDIN. вторая команда сработает, при условии, что первая сработала. quack quixote 14 лет назад 0
tar не принимает поток данных из STDIN, это должен быть список файлов. matpie 14 лет назад 3
@sirlancelot: правильно, спасибо. исправил мой ответ, чтобы отразить это. quack quixote 14 лет назад 0
0
Jack M.

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

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

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

Я не делал это для сжатия. Я делал это, потому что .tar.bz2 можно монтировать, не распаковывая, а .bz2 - нет. Для очень больших сжатых файлов (например, карты OSM и дампы из Википедии - это очень большие XML-файлы, хранящиеся в формате .bz2), вы действительно не хотите распаковывать все это на свой диск, чтобы использовать его. endolith 14 лет назад 1
Тогда я думаю, мне нужно знать, что вы хотите сделать с этим файлом? Вы хотите разобраться с языком программирования, найти его и т. Д.? Jack M. 14 лет назад 0
Оба из тех, да. endolith 14 лет назад 0

Похожие вопросы