Linux - Czy istnieje sposób na konwersję plików .bz2 na pliki .tar.bz2 za pomocą potoków?

5

Czy istnieje sposób na konwersję pliku .bz2 do pliku .tar.bz2 bez rozpakowywania całego pliku na dysk, a następnie ponownej kompresji? Rozmiar zdekompresowany jest większy niż mój dysk. Ponieważ bz2 działa na blokach, wydaje się, że można po prostu zdekompresować blok, przesłać go, ponownie skompresować, usunąć zdekompresowany blok z pamięci itp.

Zapytałem o to na forach Ubuntu i nie znalazłem odpowiedzi.

endolit
źródło
4
Dlaczego chcesz to zrobić?
matpie
Pierwotnie miał pracować z bardzo dużymi plikami danych bez ich rozpakowywania. archivemount pozwala zamontować plik .tar.bz2 (ponieważ ma „system plików” w środku), ale nie .bz2.
endolith,

Odpowiedzi:

3

Aktualizacja: Moja oryginalna odpowiedź w ogóle nie działa, przepraszam. tarnie zaakceptuje strumienia danych ze STDIN jako danych wejściowych, więc pierwsze polecenie nie powiedzie się.

Jedynym sposobem, w jaki mogę wymyślić, co chcesz osiągnąć, jest napisanie własnego programu w celu dodania wymaganych tarnagłówków itp. Wokół strumienia danych. Następnie możesz napisać:

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

... i (zakładając, że twój program ma odpowiedni tarformat) możesz go zdekompresować za pomocą standardu tar xf foo.tar.bz2.


Prawdopodobnie nie jest to sposób, w jaki chcesz to zrobić, ponieważ nie zapewnia on żadnych zwykłych zalet tarowania pliku w pierwszej kolejności.

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

Problem polega na tym, że tar nie zawiera w sobie żadnego systemu plików, ponieważ wszystko, co mu daliśmy, to zdekompresowany strumień danych. Oznacza to, że musisz go zdekompresować / rozpakować tak:

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

quack quixote
źródło
jaka to jest wersja tar? nie działa z GNU tar 1.16.1.
goldPseudo
GNU tar 1.20 na debianie, 1.21 na cygwin. hmm masz rację, pierwsze polecenie wydaje się nie działać. tar sez tar: -: Cannot stat: No such file or directory. wydaje się, że nie lubi STDIN. drugie polecenie działałoby, zakładając, że pierwsze działało.
quack quixote
3
tarnie akceptuje strumienia danych ze STDIN, musi to być lista plików.
matpie
@sirlancelot: correct, thx. naprawiłem moją odpowiedź, aby to odzwierciedlić.
quack quixote
0

Myślę, że przekonasz się, że nie robisz tego. Kompresja uzyskana z .tbz2pliku w porównaniu do .bz2pliku jest dość minimalna, jeśli go skompresujesz --best. Oto przykład w dzienniku błędów httpd:

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

W przeciwnym razie będziesz musiał zrobić to z zatrzymaniem przy dysku twardym.

Jack M.
źródło
1
Nie robiłem tego dla kompresji. Robiłem to, ponieważ .tar.bz2 można zamontować bez rozpakowywania go, ale .bz2 nie. W przypadku bardzo dużych skompresowanych plików (mapy OSM i zrzuty Wikipedii są zarówno bardzo dużymi plikami XML przechowywanymi na przykład jako .bz2), tak naprawdę nie chcesz rozpakowywać całego pliku na dysk, aby go użyć.
endolith
Więc chyba muszę wiedzieć, co chcesz zrobić z tym plikiem? Czy chcesz przeanalizować język programowania, przeszukać go itp.?
Jack M.,
Oba, tak.
endolith,