Dodać / zaktualizować plik do istniejącego archiwum tar.gz?


73

Czy istnieje sposób na dodanie / aktualizację pliku w archiwum tar.gz? Zasadniczo mam archiwum zawierające plik /data/data/com.myapp.backup/./files/settings.txti chciałbym pobrać ten plik z archiwum (już zrobiony) i wcisnąć go z powrotem do archiwum po zakończeniu edycji. Jak mogę to osiągnąć? Czy jest to problematyczne z powodu .ścieżki?


2
+1. Ułatwi to pracę z systemem OS X. Obecnie muszę ręcznie wyczyścić katalog wszystkich ukrytych plików, takich jak, .DS_Storea następnie ponownie załadować go do katalogu.

Odpowiedzi:


15

Format pliku tar to tylko seria plików połączonych z kilkoma nagłówkami. Nie jest to bardzo skomplikowane zadanie, aby rozerwać je na części, włożyć zawartość i ponownie złożyć. To powiedziawszy, Jander opisał, w jaki sposób tar jako program nie ma funkcji narzędziowych do wykonania tego i istnieją dodatkowe komplikacje z kompresją, które muszą być zarówno przed, jak i po dokonaniu zmiany.

Istnieją jednak narzędzia do tego zadania! Istnieją co najmniej dwa systemy, które pozwolą ci na wykonanie sprzężenia zwrotnego skompresowanego archiwum tar na folder, a następnie dokonanie zmian w systemie plików. Po zakończeniu odłącz folder, a skompresowane archiwum jest gotowe do uruchomienia.

Pierwszą opcją byłby projekt archiwizacji dla FUSE . Oto samouczek na ten temat . Twój system prawdopodobnie ma już BEZPIECZNIK, a jeśli nie, Twoja dystrybucja powinna mieć taką opcję.

Inną opcją są tarfs . Jest prostszy w użyciu , ale słyszałem, że ma pewne problemy z uszkodzeniem archiwów bzip2, więc możesz najpierw przetestować to dość dokładnie.


1
Używam AVFS , który jest spakowany w Ubuntu i Debianie. Czy wiesz, jak archivemount i tarfs porównują się do AVFS?
Gilles

Szczerze mówiąc nie, nie wiem, chociaż ciekawi mnie AVFS, kiedy wspominasz o alternatywie. Używałem zarówno archiwizowania, jak i tarfs, ale to było od dawna wycofanego projektu i nie znam ich obecnego stanu. Na podstawie tego doświadczenia zdecydowałem, że pomysł był błędny koncepcyjnie, nawet jeśli wdrożenie działało idealnie.
Caleb

Przyjrzałem się, jak działa archivemount. Nie modyfikuje istniejącego pliku .tar.gz, ale po odmontowaniu zmienia nazwę oryginału i tworzy na jego miejscu zupełnie nowy plik tar. Jeśli szukasz dobrego doświadczenia użytkownika, to świetnie, ale jeśli chcesz uniknąć przepisywania całego archiwum ze względów wydajnościowych, to ci nie pomoże.
Jander

@Jander To za wskazanie tego. Jestem prawie pewien, że dotyczy to wszystkich skompresowanych opcji montowania archiwum. Problem polega na tym, że poszczególne części pliku nie są kompresowane, ogólne wewnętrzne nagłówki plików i wszystko jest kompresowane, a w celu wyodrębnienia innych rzeczy zgodnie z oczekiwaniami gzip musi być uruchomiony na całym zestawie danych. Nie ma sposobu na wstrzyknięcie czegoś w środku tego bez wyodrębnienia go i ponownego uruchomienia kompresji i przepisania całego pliku danych. Stąd mój poprzedni komentarz na temat niewłaściwego rozwiązania koncepcyjnego . Archiwa to archiwa.
Caleb,

43

Aby pobrać plik z archiwum, możesz użyć tar xzf archive.tar.gz my/path/to/file.txt. Pamiętaj, że zostaną również utworzone katalogi na ścieżce pliku. Użyj tar t(tj. tar tzf archive.tar.gz), Aby wyświetlić listę plików w archiwum.

tarnie obsługuje aktualizacji plików „w miejscu”. Można jednak dodawać pliki na końcu archiwum, nawet jeśli mają taką samą ścieżkę jak plik już w archiwum. W takim przypadku obie kopie pliku znajdą się w archiwum, a plik dodany później zastąpi wcześniejszą. Poleceniem do tego jest tar r(lub tar utylko dodawanie plików nowszych niż archiwum) to polecenie, którego należy użyć. .W ścieżce nie powinno być problemem.

Jest jednak pewien haczyk: nie można dodawać do skompresowanego archiwum. Więc musisz zrobić:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Co prawdopodobnie nie jest tym, co chcesz usłyszeć, ponieważ oznacza to dwukrotne przepisanie całego archiwum. Jeśli nie jest to bardzo duże archiwum, może być lepiej rozpakować całość, a następnie przesłać ją ponownie po edycji. Alternatywnie możesz użyć nieskompresowanego archiwum.


Ta odpowiedź jest poprawna tylko w zakresie, w jakim dotyczy standardowego tarprogramu. Tar jako format pliku jest w rzeczywistości bardzo dostępny. Możesz łatwo napisać skrypt, aby samodzielnie zaktualizować zawartość, ale istnieją już inne narzędzia, które to robią .
Caleb

23
Możesz to również zrobić w sposób uniksowy:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter

2
IIRC możesz po prostu połączyć dwa pliki gzip. Rezultatem jest większy plik gzip, który zawiera oba nieskompresowane pliki połączone.
FUZxxl

Czy po rozpakowaniu pliku nie można użyć flagi --update?
pietro

@FUZxxl +1 za wzmiankę o konkatenacji gzip
Johan Boulé

9

Tar był pierwotnie przeznaczony do stosowania na taśmach, więc „zastępowanie” plików nie jest tak naprawdę w projekcie. Możesz jednak użyć opcji --delete, aby usunąć plik z oryginalnej tar, a następnie -u, aby zaktualizować tar i ponownie dodać plik. Może to zająć trochę czasu, ponieważ tar musi wewnętrznie zreorganizować archiwum.


Witamy w StackExchange! Twoja odpowiedź zawiera tylko sugestię zawartą w innej odpowiedzi . Przed udzieleniem odpowiedzi przeczytaj pozostałe odpowiedzi na pytanie, aby uniknąć tworzenia duplikatów.
JigglyNaga,

1
Trochę zredagowałem swoją odpowiedź. Nie wydaje mi się, aby inna odpowiedź wymieniała
usuń

-5

na moim systemie Linux x86_64 GNU / Linux do wykonania tej operacji używam po prostu następującej komendy:

tar cvfpz /path/archive.tar -T list.txt

To polecenie powoduje utworzenie skompresowanego archiwum przy /pathużyciu listy plików zawartych w list.txtpliku.


6
To zastępuje istniejący plik /path/archive.tar, zamiast dodawać / aktualizować ten plik.
Anthon
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.