2013-09-08 24 views
120

mam następujące polecenie w ramach tworzenia kopii zapasowych skrypt powłoki:Tar katalogiem, ale nie przechowywać pełne ścieżki bezwzględne w archiwum

tar -cjf site1.bz2 /var/www/site1/ 

Kiedy wyświetlić zawartość archiwum, mam :

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 

Ale chciałbym, aby usunąć część /var/www/site1 z nazw katalogów i plików w archiwum, w celu uproszczenia i uniknięcia niepotrzebnego ekstrakcji stałą strukturę katalogów. Nigdy nie wiadomo, w przypadku gdybym wyodrębnił kopie zapasowe stron internetowych w miejscu, w którym dane internetowe nie były przechowywane pod numerem /var/www.

Na powyższym przykładzie chciałbym posiadać:

tar -tf site1.bz2 
style.css 
index.html 
page2.html 
page3.html 
images/img1.png 
images/img2.png 
subdir/index.html 

Tak, że kiedy wyodrębnić pliki są wyodrębniane w bieżącym katalogu i nie trzeba przenieść wypakowywanego potem i tak struktury podkatalogów są zachowane.

Istnieje już wiele pytań na temat tar i tworzenia kopii zapasowych w stackoverflow oraz w innych miejscach w Internecie, ale większość z nich prosi o zrzucenie całej struktury podkatalogu (spłaszczenia) lub po prostu dodanie lub usunięcie początkowego/w nazwy (nie wiem, co dokładnie zmienia się podczas wyodrębniania), ale nie więcej.

Po przeczytaniu niektóre z występujących tu i tam, jak również obsługi rozwiązań, pró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 pracował tak, jak chcę. Niektórzy nie robią nic, inni nie archiwizują już podkatalogów.

Jest wewnątrz skryptu powłoki zapasowej uruchamianego przez Crona, więc nie wiem dobrze, który użytkownik go uruchamia, jaka jest ścieżka i katalog bieżący, więc zawsze trzeba podać absolutną ścieżkę dla wszystkiego i wolałabym nie zmieniając bieżącego katalogu, aby uniknąć dalszego łamania czegoś w skrypcie (ponieważ nie tylko tworzy kopie zapasowe stron internetowych, ale także baz danych, a następnie wysyła je wszystkie na FTP itp.)

Jak to osiągnąć?

Czy właśnie źle zrozumiałem, w jaki sposób opcja -C działa?

+0

możliwy duplikat [Jak używać tar do archiwizowania plików z różnych katalogów bez struktury katalogów] (http://stackoverflow.com/questions/18675523/how-to-use-tar-to-archive-files-from- different-directories-without-directory-str) –

+0

Stack Overflow to strona z pytaniami do programowania i programowania. To pytanie wydaje się być nie na temat, ponieważ nie chodzi o programowanie czy rozwój. Zobacz [Jakie tematy mogę tu zadać] (http://stackoverflow.com/help/on-topic) w Centrum pomocy. Być może lepszym rozwiązaniem będzie [Super użytkownik] (http://superuser.com/) lub [Unix i Linux Stack Exchange] (http://unix.stackexchange.com/). – jww

Odpowiedz

186
tar -cjf site1.tar.bz2 -C /var/www/site1 . 

w powyższym przykładzie, smoła zmieni katalogu /var/www/site1 przed robi swoje rzeczy, ponieważ opcja -C /var/www/site1 dano.

Od man tar:

OTHER OPTIONS 

    -C, --directory DIR 
     change to directory DIR 
+61

Nie przegap kropki na końcu, to ważne ;-) –

+2

Co zrobić, jeśli chcesz również wybrać pliki do tworzenia kopii zapasowych na podstawie symbolu wieloznacznego? -C/var/www/site1 * .dat nie działa :( –

+1

'(d = $ PWD && cd/var/www/site1 && tar -cjf $ d/site1.tar.bz2 * .dat)' –

10

Opcja -C prace; tylko dla wyjaśnienia wyślę 2 przykłady:

  1. utworzenie archiwum bez pełnej ścieżki: pełną ścieżkę /home/testuser/workspace/project/application.war i co chcemy tylko project/application.war tak:

    tar -cvf output_filename.tar -C /home/testuser/workspace project 
    

    Uwaga: nie ma spacja między workspace i project; tar zastąpi pełną ścieżkę tylko z project.

  2. wydobycie archiwum ze zmianą ścieżki docelowej (domyślnie do ., tj bieżącym katalogu)

    tar -xvf output_filename.tar -C /home/deploy/ 
    

    tar rozpakuje archiwum na podstawie danej ścieżki i konserwowanie ścieżkę stworzenia; w naszym przykładzie plik application.war zostanie wyodrębniony do /home/deploy/project/application.war.

    /home/deploy: podany na wyciągu
    project: podany na tworzenie archiwum

UWAGA: Jeśli chcesz umieścić utworzonego archiwum w katalogu docelowym, wystarczy dodać ścieżkę docelową przed nazwą plik stage. np .:

tar -cvf /path/to/place/output_filename.tar -C /home/testuser/workspace project 
+1

jak dodać symbol wieloznaczny do wyboru pliku w ostatnim przykładzie? – Siva

+0

Problem z symbolami wieloznacznymi polega na tym, że powłoka rozwija je do pasujących nazw plików, a ten program nie rozszerza ich, jeśli są cytowane ... –

2

Wydaje wiele z nich źle opcję w smole -C.

tar target_path/file.tar.gz -C source_path/source_dir . 

lub

tar target_path/file.tar.gz -C source_path/source_dir 

nie usunie bezwzględnej ścieżki prefiks wewnątrz wytwarzanej tar.gz.

Najprostszym rozwiązaniem jest cd do source_path (katalogu nadrzędnego source_dir) i uruchomić

tar target_path/file.tar.gz source_dir 

w skrypcie. Spowoduje to usunięcie prefiksu ścieżki bezwzględnej w wygenerowanej strukturze katalogu pliku tar.gz.

3

Następujące polecenie utworzy katalog główny "." i umieść w nim wszystkie pliki z określonego katalogu.

tar -cjf site1.tar.bz2 -C /var/www/site1 . 

Jeśli chcesz umieścić wszystkie pliki w katalogu głównym pliku tar, @chinthaka ma rację. Po prostu przejdź do katalogu i wykonaj:

tar -cjf target_path/file.tar.gz * 

Spowoduje to umieszczenie wszystkich plików w pliku cwd w pliku tar jako plików root.

+0

Użycie znaku * nie zapisuje żadnych "ukrytych" plików .files lub .folders. (fyi, używając -C razem z * nie działa, powłoka rozszerza bieżący katalog, a nie katalog -C) – Xen2050

Powiązane problemy