Czy istnieje lepsza aplikacja tar lub cpio do wydajnego pobierania pliku przechowywanego w archiwum?


24

Używam tardo archiwizacji grupy bardzo dużych bz2plików (wielu GB) .

Jeśli użyję tar -tf file.tardo wyświetlenia listy plików w archiwum, zajmuje to bardzo dużo czasu (~ 10-15 minut).

Podobnie, cpio -t < file.cpiowypełnienie zajmuje tyle samo, co kilka sekund plus lub minus.

W związku z tym pobieranie pliku z archiwum ( tar -xf file.tar myFileOfInterest.bz2na przykład przez) jest równie powolne.

Czy istnieje metoda archiwizacji, która utrzymuje łatwo dostępny „katalog” z archiwum, aby można było szybko pobrać pojedynczy plik w archiwum?

Na przykład jakiś katalog, który przechowuje wskaźnik do określonego bajtu w archiwum, a także rozmiar pliku do pobrania (a także inne szczegółowe informacje dotyczące systemu plików).

Czy istnieje narzędzie (lub argument do tarlub cpio), które umożliwia wydajne pobieranie pliku w archiwum?

Odpowiedzi:


15

tar (oraz cpio i afio i pax i podobne programy) są formatami zorientowanymi na strumień - mają one być przesyłane strumieniowo bezpośrednio na taśmę lub przesyłane do innego procesu. podczas gdy teoretycznie byłoby możliwe dodanie indeksu na końcu pliku / strumienia, nie znam żadnej wersji, która by to zrobiła (byłoby to jednak przydatne rozszerzenie)

nie pomoże w twoich istniejących archiwach tar lub cpio, ale istnieje inne narzędzie, dar („archiwum dysku”), które tworzy pliki archiwów zawierające taki indeks i może zapewnić szybki bezpośredni dostęp do poszczególnych plików w archiwum .

jeśli dar nie jest dołączony do twojego unix / linux-dist, możesz go znaleźć na:

http://dar.linux.free.fr/


Czy istnieje sposób na podłączenie ekstrakcji do standardowej mocy wyjściowej? Wygląda na to, że istnieje sposób na utworzenie archiwum ze standardowego wejścia, ale nie sposób (przynajmniej nie bezpośrednio) wyodrębnienia na standardowe wyjście. Z dokumentacji nie wynika jasno, czy można to zrobić. Czy wiesz, jak można to osiągnąć?
Alex Reynolds,

1
nie, nie wiem. Sam tak naprawdę nie używam daru ... po prostu wiem, że istnieje. Jestem wystarczająco zadowolony z tar, i zwykle po prostu tworzę pliki tekstowe z listą zawartości dużych plików tar, które chciałbym wyszukać później. możesz to zrobić w tym samym czasie, co tworzenie archiwum tar, używając dwukrotnie opcji v (np. „tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt”)
cas

10

Możesz użyć SquashFS do takich archiwów. To jest

  • zaprojektowany, aby uzyskać do niego dostęp za pomocą sterownika bezpiecznika (chociaż istnieje tradycyjny interfejs)
  • skompresowany (im większy rozmiar bloku, tym bardziej wydajny)
  • zawarty w jądrze Linuksa
  • przechowuje UID / GID i czas utworzenia
  • świadomy endianess, dlatego dość przenośny

Jedyną wadą, jaką znam, jest to, że jest tylko do odczytu.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html


8

Chociaż nie przechowuje indeksu, starjest rzekomo szybszy niż tar. Ponadto obsługuje dłuższe nazwy plików i ma lepszą obsługę atrybutów plików.

Jestem pewien, że zdajesz sobie sprawę, że dekompresja pliku zajmuje dużo czasu i prawdopodobnie byłaby czynnikiem wpływającym na szybkość wyodrębniania, nawet gdyby istniał indeks.

Edycja: możesz także rzucić okiem xar. Ma nagłówek XML, który zawiera informacje o plikach w archiwum.

Z odnośnej strony:

Nagłówek XML Xar pozwala mu zawierać dowolne metadane dotyczące plików zawartych w archiwum. Oprócz standardowych metadanych pliku unix, takich jak rozmiar pliku oraz czas jego modyfikacji i utworzenia, xar może przechowywać informacje, takie jak bity plików ext2fs i hfs, flagi unix, odniesienia do rozszerzonych atrybutów, informacje o Mac OS X Finder, Mac OS Widelce zasobów X i skróty danych pliku.


+1 za powiadomienie mnie o przydatnym narzędziu dźwiękowym, o którym nigdy wcześniej nie słyszałem.
cas

Link of staris down ......
Pacerier

5

Thorbjørn Ravn Anderser ma rację. GNU tar domyślnie tworzy „widoczne” archiwa. Ale nie korzysta z tych informacji, gdy czyta te archiwa, jeśli nie podano opcji -n. Z opcją -n właśnie wyodrębniłem plik 7 GB z archiwum 300 GB w czasie wymaganym do odczytu / zapisu 7 GB. Bez tego zajęło to więcej niż godzinę i nie przyniosło żadnego rezultatu.

Nie jestem pewien, jak wpływa na to kompresja. Moje archiwum nie zostało skompresowane. Skompresowane archiwa nie są „widoczne”, ponieważ bieżąca (1.26) tar GNU odciąża kompresję do programu zewnętrznego.


według strony man tar man7.org/linux/man-pages/man1/tar.1.html , GNU tar domyślnie użyje formatu możliwego do odczytu podczas pisania, a jeśli archiwum jest możliwe do przeglądania, użyje go podczas czytania (dla lista lub wyciąg). Jeśli używasz GNU tar i nadal widzisz problem, powinieneś zgłosić błąd w GNU.
Brian Minton

7
Jeśli poprawnie przeczytam instrukcję, nigdy nie mówi ona, że ​​ma jakikolwiek indeks i może przejść do dowolnego pliku w archiwum, podając nazwę pliku. --seek oznacza po prostu, że podstawowe media są widoczne, więc kiedy czyta od początku, może pominąć czytanie zawartości pliku, ale nadal musi czytać nagłówki wpisów od początku. To powiedziawszy, jeśli masz archiwum z plikami 1M i próbujesz wyodrębnić ostatni, przy pomocy --no-seek, musisz przeczytać zawartość wszystkich plików; z opcją --seek wystarczy odczytać tylko 1 mln nagłówków, po jednym dla każdego pliku, ale nadal jest on bardzo wolny.
icando

4

Jedynym znanym mi formatem archiwum, w którym przechowywany jest indeks, jest ZIP, ponieważ musiałem zrekonstruować uszkodzone indeksy więcej niż raz.


2

Nie indeksuje tego, co znam, ale używam zrzutu i przywracania z dużymi plikami, a nawigacja po drzewie przywracania w trybie interaktywnym, aby wybrać losowe pliki, jest BARDZO szybka.


2

Jeśli masz dostęp do p7zip-fullpakietu, możesz użyć formatu archiwum / kompresji 7z (7zip) .

W systemie Ubuntu możesz użyć tego polecenia, aby je zainstalować:

$ sudo apt-get install p7zip-full

Aby utworzyć archiwum, którego możesz użyć, 7z a <archive_name> <file_or_directory>a jeśli nie chcesz kompresować plików i chcesz je po prostu „zapisać” w stanie, w jakim się znajduje, możesz użyć -mx0opcji:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Następnie możesz wyodrębnić pliki, używając 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Możesz też wymienić indeks archiwum, 7z lktóry jest przydatny do wyszukiwania za pomocą grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Jest to również topcja testowania integralności, udodawania / aktualizowania pliku do archiwum oraz dusuwania pliku.

UWAGA
Do nie używać formatu 7zip dla Linuksa systemu plików kopii zapasowych, ponieważ nie przechowywać właściciela i grupę plików zawartych.


W przypadku Linuksa dobrze byłoby 7zip plik tar.
Thorbjørn Ravn Andersen

1

Wierzę, że GNU tar jest w stanie robić to, co chcesz, ale nie mogę znaleźć ostatecznego zasobu, który to mówi.

W każdym razie potrzebujesz formatu archiwizacji z indeksem (ponieważ pozwoli ci to robić, co chcesz). Nie wierzę, że pliki ZIP mogą niestety urosnąć tak bardzo.


Pliki ZIP mogą rosnąć duży .
Pacerier

1
Jeśli poprawnie przeczytam instrukcję, nigdy nie mówi ona, że ​​ma jakikolwiek indeks i może przejść do dowolnego pliku w archiwum, podając nazwę pliku. --seek oznacza po prostu, że podstawowe media są widoczne, więc kiedy czyta od początku, może pominąć czytanie zawartości pliku, ale nadal musi czytać nagłówki wpisów od początku. To powiedziawszy, jeśli masz archiwum z plikami 1M i próbujesz wyodrębnić ostatni, przy pomocy --no-seek, musisz przeczytać zawartość wszystkich plików; z opcją --seek wystarczy odczytać tylko 1 mln nagłówków, po jednym dla każdego pliku, ale nadal jest on bardzo wolny.
icando

2
@Pacerier W moim rozumieniu format ZIP64 pozwala na bardzo duże pliki, ale oryginalny format ZIP nie.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen, pojedynczy plik 4 GB to wielki koleś.
Pacerier

3
@Pacerier 4GB nie był duży, odkąd DVD ISO pojawiło się na scenie prawie dwadzieścia lat temu. Terrabytes jest obecnie duży.
oligofren,
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.