Mam następujące polecenie w części skryptu powłoki kopii zapasowej:
tar -cjf site1.bz2 /var/www/site1/
Kiedy wymieniam zawartość archiwum, otrzymuję:
tar -tf site1.bz2
var/www/site1/style.css
var/www/site1/index.html
var/www/site1/page2.html
var/www/site1/page3.html
var/www/site1/images/img1.png
var/www/site1/images/img2.png
var/www/site1/subdir/index.html
Chciałbym jednak usunąć część /var/www/site1
z katalogu i nazw plików w archiwum, aby uprościć ekstrakcję i uniknąć niepotrzebnej stałej struktury katalogów. Nigdy nie wiem, na wypadek, gdybym wyodrębnił kopie zapasowe witryn w miejscu, w którym nie były przechowywane dane internetowe /var/www
.
W powyższym przykładzie chciałbym mieć:
tar -tf site1.bz2
style.css
index.html
page2.html
page3.html
images/img1.png
images/img2.png
subdir/index.html
Tak więc, gdy rozpakowuję, pliki są wyodrębniane w bieżącym katalogu i nie muszę później przenosić wyodrębnionych plików, aby zachować struktury podkatalogów.
Jest już wiele pytań o tar i kopie zapasowe w stackoverflow
innych miejscach w sieci, ale większość z nich prosi o usunięcie całej struktury podkatalogu (spłaszczanie), lub po prostu dodanie lub usunięcie początkowego / w nazwach (nie t wiem, co się dokładnie zmienia podczas wypakowywania), ale nie więcej.
Po przeczytaniu niektórych rozwiązań tu i ówdzie, a także instrukcji, wypróbowałem:
tar -cjf site1.bz2 -C . /var/www/site1/
tar -cjf site1.bz2 -C / /var/www/site1/
tar -cjf site1.bz2 -C /var/www/site1/ /var/www/site1/
tar -cjf site1.bz2 --strip-components=3 /var/www/site1/
Ale żaden z nich nie działał tak, jak chcę. Niektórzy nic nie robią, inni nie archiwizują już podkatalogów.
Znajduje się w skrypcie powłoki kopii zapasowej uruchomionym przez Crona, więc nie wiem dobrze, który użytkownik go uruchamia, jaka jest ścieżka i katalog bieżący, więc zawsze wszystko wymaga wpisania ścieżki bezwzględnej i wolałbym nie zmieniać bieżącego katalogu aby uniknąć zepsucia czegoś w skrypcie (ponieważ nie tylko tworzy kopie zapasowe stron internetowych, ale także baz danych, a następnie przesyła to wszystko na FTP itp.)
Jak to osiągnąć?
Czy właśnie źle zrozumiałem, jak działa opcja -C?
-C
oznacza po prostu „zmień katalog”, a zastąpienie ścieżki (lub prefiksu) może być wykonane tylko przez--transform
. rif. superuser.com/questions/595510/prepend-prefix-in-tar/595512 możesz w prosty sposób -C (zmienić katalog) i --transformować go: `` tar cjf site1.bz2 --transform "s / ^ \. \ // $ targetbase / "-C / var / www / site1. ``Odpowiedzi:
W powyższym przykładzie tar zmieni katalog na
/var/www/site1
przed wykonaniem swojej czynności, ponieważ-C /var/www/site1
podano opcję .Od
man tar
:źródło
tar
o zarchiwizowaniu wszystkiego w bieżącym katalogu. I-C
ustawia bieżący katalog.tar -czvf site1.tar.gz -C /var/www/ site1
(Zwróć uwagę na spację, nadal używam -C, aby cd do katalogu macierzystego i określając katalog do tar zamiast kropki)./folders
Jak można to usunąć?Opcja
-C
działa; tylko dla wyjaśnienia opublikuję 2 przykłady:stworzenie tarballa bez pełnej ścieżki: pełna ścieżka
/home/testuser/workspace/project/application.war
i to, czego chcemy, to po prostuproject/application.war
:Uwaga: pomiędzy
workspace
i jest spacjaproject
; tar zastąpi pełną ścieżkę justproject
.ekstrakcja tarballa ze zmianą ścieżki docelowej (domyślnie na
.
np. bieżący katalog)tar
wyodrębni tarball na podstawie podanej ścieżki i zachowa ścieżkę tworzenia; w naszym przykładzie plikapplication.war
zostanie rozpakowany/home/deploy/project/application.war
./home/deploy
: podany przy wyciąguproject
: podany przy tworzeniu tarballaUwaga: jeśli chcesz umieścić utworzony plik tarball w katalogu docelowym, po prostu dodaj ścieżkę docelową przed nazwą pliku tarball. na przykład:
źródło
Wydaje się, że
-C
opcja upto tar v2.8.3 nie działa konsekwentnie na wszystkich platformach (systemach operacyjnych).-C
opcja mówi się, aby dodać katalog do archiwum, ale na Macu i Ubuntu dodaje absolutny prefiks ścieżki do wygenerowanego pliku tar.gz.Dlatego spójnym i niezawodnym rozwiązaniem jest przejście
cd
do ścieżki_źródłowej (katalog macierzysty katalogu_źródłowego) i uruchomienielub
w twoim skrypcie. Spowoduje to usunięcie prefiksu ścieżki bezwzględnej w strukturze katalogów wygenerowanego pliku tar.gz.
źródło
-cvf
dodanym późniejtar
) okazuje się, że wynikowy plik tar.gz nie zawiera ścieżek bezwzględnych, co jest zgodne z kilkoma innymi odpowiedziami. Jeśli uważasz, że tar jest uszkodzony lub nieaktualny w obu systemach, których użyłem do testowania, proszę link do dokumentacji, która potwierdziłaby twoją odpowiedź. Myślę, że-C
opcja zmienia katalog przed wykonaniem (jak w innych odpowiedziach). Kiedy go pomijam, tar próbuje dodać śmieci./
, w tym ścieżki od początku./
.cd
pierwsze. Twoja odpowiedź mówi, że narzędzie działa w sposób odwrotny do tego, jak mówią doktorzy, że działa i jak działa w moim systemie, więc jest to zła odpowiedź. Możesz to łatwo naprawić.Następujące polecenie utworzy katalog główny „.” i umieść w nim wszystkie pliki z określonego katalogu.
Jeśli chcesz umieścić wszystkie pliki w katalogu głównym pliku tar, @chinthaka ma rację. Po prostu włóż płytę do katalogu i wykonaj:
Spowoduje to umieszczenie wszystkich plików w cwd w pliku tar jako plików root.
źródło
Użycie „punktu” prowadzi do utworzenia folderu o nazwie „punkt” (w Ubuntu 16).
Zajmowałem się tym bardziej szczegółowo i przygotowałem przykład. Nagrywanie wielu linii plus wyjątek.
źródło
.
bieżący katalog. W kontekścietar.gz
struktury to tylko podstawowy / główny / najwyższy poziom, prawda?Jeśli chcesz zarchiwizować podkatalog i przyciąć ścieżkę podkatalogu, to polecenie będzie przydatne:
źródło