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.


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


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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.