Maksymalna kompresja archiwizacji z zachowaniem praw plików

Zaczęty przez TJM, 04 Czerwiec 2009, 13:29

TJM

Jak w temacie, czego użyć, żeby wycisnąć jak największą kompresję i jednocześnie zachować informacje o prawach dostępu/właścicielach pliku ?
Na swojej linuksowo-developerskiej maszynie archiwizuję często setki megabajtów różnych źródeł, często edytowanych, bo czasami się to przydaje przy przenoszeniu swoich zmian na nowsze wersje oprogramowania.
Problem taki, że standardowo robię to po prostu przez tar -czf i kompresja wychodzi biedna. To samo archiwum rozpakowane pod Windows i spakowane ponownie 7zipem potrafi być 5-6 razy mniejsze...
Filtrowanie przez bzip daje trochę lepsze efekty, ale nadal to nie to samo.
Lepszy efekt daje tar bez kompresji i potem spakowanie rarem/7zipem, ale archiwum i tak wychodzi większe, a przy rozpakowaniu potrzeba już dwóch przebiegów.
Jeszcze lepszy sposób to niby układanie plików w tarze według rozszerzeń, bez kompresji. Wtedy po spakowaniu dodatkowo rarem/7zipem wychodzi piękne malutkie archiwum, o wielkości odpowiadającej praktycznie archiwum typu solid 7zipa czy RARa. Tutaj jednak pojawia się problem w stworzeniu takiego czegoś, kiedyś miałem skrypt który rekurencyjnie czytał katalogi i sortował pliki według rozszerzeń, ale wywaliłem go, bo i tak nie radził sobie kiedy w katalogu było za dużo plików.

Znacie jakieś inne/lepsze sposoby ? Chętnie bym upgrejdnął moje sposoby archiwizacji danych, bo na chwilę obecną archiwa zaczynają mi zajmować tyle miejsca, że muszę je wypalać na blurayach :/

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

buninek

7z + tar

tar cf - /tmp/test/*.{txt,pdf,html} | 7za a -si -mx=9 test.tar.7z

jeśli używasz Midnight Commandera to takie archiwa będą półprzezroczyste.

Może czas wyjść z ciemnych wieków kerneli 2.6.18 i troszkę poeksperymentować z czymś nowszym. :D
Są systemy plików z kompresją (całkowita przezroczystość).

Świetny jest reiser4 (bardzo dobra wydajność) co prawda nie ma go w głównej gałęzi kernela, ale to ze względów pozaformalnych. Współtwórca przebywa w więzieniu i to chyba z dożywociem.
Można spatchować kernel http://www.kernel.org/pub/linux/kernel/people/edward/reiser4/reiser4-for-2.6/

Obecie testuję btrfs (mój faworyt). Również umożliwia kompresję. Jest dostępny od 2.6.29.
Możliwości ma ogromne, wydajność dobrą.
http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg02409.html

Umożliwia rozszerzanie, zmniejszania w locie, kompresję, tworzenia snapshotów, tworzenie raidów, optymalizację
dla dysków ssd i dużo więcej
http://btrfs.wiki.kernel.org/index.php/Main_Page#Documentation

Jest squashfs w połączeniu z aufs daje duże możliwości.
http://jakilinux.org/linux/slackware/slax-60-jak-to-dziala/


W konću lvm http://devrandom.pl/2008/12/lvm/

Kiedyś był E2compr już nierozwijany.

Oczywiście ze względów bezpieczeństwa wszystko można testować na pikopartycjach ich tworzenie, montowanie i zarządzanie jest banalnie proste.

TJM

Systemy plików z kompresją odpadają, bo to i tak idzie z czasem do nagrania na płyty. No i głównie na ilości płyt chcę zaoszczędzić, łatwiej później się szuka czegoś na 10 płytach z długą listą do każdej, niż na 100 z krótszymi...

Połączenie czegoś z wysoką kompresją z tarem jest fajne, tylko teraz trzeba jeszcze sortować po rozszerzeniach, a z tym już ciut gorzej, bo w jednym takim dużym katalogu do skompresowania może być ze 100 jak nie więcej różnych.

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.


buninek

Cytat: TJM w 04 Czerwiec 2009, 15:24
Połączenie czegoś z wysoką kompresją z tarem jest fajne, tylko teraz trzeba jeszcze sortować po rozszerzeniach, a z tym już ciut gorzej, bo w jednym takim dużym katalogu do skompresowania może być ze 100 jak nie więcej różnych.

Szukanie po rozszerzeniach, rozmiarze, uprawnieniach, datach utworzenia - find cię wyręczy.

pliki tylko z roszerzeniem txt, pdf, doc
find /katalogi/do/archiwum/ -xdev -type f -regex '.*\.\(txt\|pdf\|doc\)$' -print0 | tar --null -T - -cvf - | 7za a -si -mx=9 /archiwum.txt.pdf.doc.tar.7z

ewentualnie -type f '(' -name '*.txt' -o -name '*.pdf' -name '*.doc' ')'

wszystkie oprócz plików z roszerzeniem txt, pdf, doc
find /katalogi/do/archiwum/ -xdev -type f ! -regex '.*\.\(txt\|pdf\|doc\)$' -print0 | tar --null -T - -cvf - | 7za a -si -mx=9 /archiwum.tar.7z

pliki tylko z roszerzeniem txt, pdf, doc i większe niż 10MB
find /katalogi/do/archiwum/ -xdev -size +10M -type f -regex '.*\.\(txt\|pdf\|doc\)$' -print0 | tar --null -T - -cvf - | 7za a -si -mx=9 /archiwum.tar.7z


z jednoczesnym kasowaniem
find /katalogi/do/archiwum/ -xdev -size +10M -type f -regex '.*\.\(txt\|pdf\|doc\)$' -print0 | tar --remove-files --null -T - -cvf - | 7za a -si -mx=9 /archiwum.tar.7z


SquashFS ma tą przewagę, że na podmontowanym woluminie masz bezpośredni dostęp do plików, ogromny atut.

TJM

Wszelkie wyszukiwanie po rozszerzeniach odpada, nigdy nie wiem co za rozszerzenia znajdą się w archiwum, a nawet gdybym wiedział, to wpisywanie po kolei wszystkich, żeby uzyskać coś na kształt solid archive RARa byłoby lekkim przegięciem.
Spróbuję pomaltretować znajomego, żeby napisał mi program w C czytający stdout z ls -RX1 a następnie sortował pliki według rozszerzenia, w ten sposób teoretycznie udałoby się uzyskać ładną listę w formacie pełna_ścieżka/plik w każdej linii. Teraz jeszcze pytanie, jak to przekazać do tara %)


W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.