tar: Usuwanie wiodącego `/ 'z nazw członków

137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

Jak mogę rozwiązać ten problem i zachować /nazwy plików?

superużytkownik
źródło
2
Co dokładnie nie działa zgodnie z oczekiwaniami?
34
To nie jest problem. Nie chcesz wiodących ukośników w archiwum tar. Poważnie. Jeśli chcesz rozpakować archiwum do katalogu głównego systemu, określ -C /podczas rozpakowywania.
ThiefMaster,

Odpowiedzi:

69

Użyj opcji --absolute-nameslub -P, aby wyłączyć tę funkcję.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo
Barmar
źródło
54
To poprawna odpowiedź, ale pamiętaj, że w większości przypadków nie jest to to, czego chcesz , ponieważ powoduje to archiwum, które wyodrębnia pełne ścieżki!
rubo77
8
Użycie -C /opcji opisanej w odpowiedzi @Marcus pozbędzie się komunikatu STDERR, jeśli jest to twój główny cel.
Matt Sanders,
1
Jak skomentował @ rubo77, zwykle nie jest to oczekiwany wynik polecenia.
alfredocambera
3
W większości przypadków nie tego chce użytkownik, po prostu dlatego, że większość z nich nie czyta instrukcji, dopóki tego nie potrzebuje (nikt nie ma na to czasu). Rozsądnie byłoby więc przynajmniej poszerzyć swoją odpowiedź, ostrzegając ludzi, aby tego nie robili, chyba że są absolutnie pewni, że rozumieją, jaki jest tego skutek. Zwłaszcza zaakceptowanie jako odpowiedź.
Mladen B.
1
@Toskan Przykłady dodane
Barmar
89

To właściwie funkcja, a nie problem. Archiwa z absolutnymi lokalizacjami stanowią zagrożenie bezpieczeństwa. Atakujący mogą wykorzystać takie archiwa, aby nakłonić użytkowników do zainstalowania plików w krytycznych lokalizacjach systemu.

Tak, możesz użyć -P. Ale co jest złego w pozwoleniu tarowi na usunięcie ukośnika i po prostu wymaganie od użytkownika archiwum jawnego wyodrębnienia w katalogu głównym? Następnie świadomie wpływają na krytyczne lokalizacje systemu i nie mogą tego zrobić przypadkowo.

Mark Adler
źródło
5
Czasami funkcje są problemami. Znalazłem ten wątek po skonfigurowaniu skryptu zapasowego, który wyśle ​​wiadomość e-mail o niezerowym statusie wyjścia z tar. Ta konkretna wiadomość powodowała tarwyjście ze stanu 1, co powodowało, że otrzymywałem fałszywe powiadomienia e-mail o pomyślnych kopiach zapasowych, po prostu dlatego, że tarpisałem tę wiadomość do STDERR. Rozwiązałem ten problem, używając własnej, poprawionej wersji rozwiązania @ Marcus:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails
1
Sądzę, że istnieją pewne przypadki użycia -P- na przykład, jeśli udostępniasz jakąś funkcję migawek systemu plików w FUSE. Czasami możesz chcieć rozpakować migawkę w określonym katalogu, a nie cwdz perspektywy użytkownika.
DIMMSum
81

Jeśli chcesz pozbyć się „Usuwania wiodącego„ / ”z nazw członków” drukowanych do STDERR, ale nadal chcesz odrzucić te wiodące ukośniki, tak jak domyślnie tar, widziałem tutaj doskonałe rozwiązanie komentującego timsoft.

Rozwiązanie polega na użyciu opcji -C do zmiany katalogu na katalog główny (/), a następnie określeniu drzewa plików do zarchiwizowania bez początkowego ukośnika, ponieważ teraz potrzebujesz tylko ścieżki względnej. Działa to tak samo jak normalne polecenie tworzenia tar, ale nie jest wymagane usuwanie:

tar fcz bkup.tar.gz -C / home/foo/
Marcus
źródło
Nie będzie działać z przyrostowymi kopiami zapasowymi. Ale dobra odpowiedź.
gajdipajti
Nie działa również, jeśli chcesz tarować pliki oznaczone przez rozszerzenie powłoki (np. tar c -C / home/foo/*), Ponieważ powłoka nie wie o zmienionym katalogu głównym. Ale wciąż dobra odpowiedź na inne przypadki.
Boris
1
-C /nie działa dla mnie kropka. Dla mnie to nie przeszkadza stderrowi.
Acumenus,
3
@ABB upewnij się, że ścieżka po -C / jest względna.
zurfyx
Czy to podejście zadziała, jeśli użytkownik nie ma uprawnień do katalogu głównego?
Mladen B.
31

Miesiąc później, ale znalazłem najbardziej odpowiednie rozwiązanie dla mojej sprawy (w skrypcie powłoki) jest przejście do katalogu nadrzędnego i wykonanie tam polecenia.

cd /var/www/
tar -czf mysite.gz mysite

Zamiast:

tar -czf /var/www/mysite.gz /var/www/mysite
amd
źródło
9
Rzeczywiście mogłeś to zrobić za pomocą: tar -zcvf mysite.gz -C / var / www / mysite / Zaletą tego jest to, że możesz go wykonać z dowolnego katalogu
alfredocambera
Dziękuję za pomoc Właśnie tego potrzebowałem. Nie chciałem pełnej ścieżki w moim archiwum, tylko folder docelowy.
Christia,
Myślę, że powinna to być prawdopodobnie poprawna odpowiedź.
Mladen B.
W ogóle nie rozumiem, jak to odpowiada na pytanie. To coś innego, co można zrobić. ……… Podoba mi się: P: Jak dostać się z Los Angeles do Nowego Jorku? Odp .: Zamiast tego idź do San Francisco.
G-Man
Zgadzam się z @ G-Man. Spowoduje to utworzenie pliku tar o zupełnie innej strukturze katalogów. W niektórych przypadkach ta struktura katalogów jest w rzeczywistości bardziej odpowiednia, ale nie odpowiada na pytanie.
Kevin Keane,
7

Jest to, jak zrobiłem to za pomocą metody brute force: 2>&1 | grep -v "Removing leading".

Na przykład:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"
bjackfly
źródło
4
Problem polega na tym, że ukrywa kod błędu. Więc jeśli chcesz sprawdzić kod błędu z tar w skrypcie bash, to nie zwróci 0 po sukcesie.
Brian
@staticx, kod błędu wynosi 0 niezależnie.
Acumenus,
1
@ABB Moje tarpolecenie może wrócić 2po błędzie krytycznym.
Jite
1
@ Brian, możesz użyć $ PIPESTATUS, aby uzyskać kod wyjścia. Zobacz unix.stackexchange.com/questions/14270/…
simpleuser 10.09.16
3

Spróbuj użyć -Ctylko ścieżki, która uniemożliwi kompresję pełnymi ścieżkami:

root@server # tar fcz bkup.tar.gz -C /home/ foo/
Nick Tsai
źródło
2

Rozwiązałem ten problem z:

cd /home/foo && tar czf ~/backup.tar.gz .

w ten sposób nie próbujesz umieszczać absolutnych ścieżek w archiwum tar. Jeśli chcesz rozpakować go w katalogu głównym systemu plików, po prostu

cd / && tar xzf backupt.tar.gz po przeniesieniu.

James
źródło