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
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.
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:
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.
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".
-C /
podczas rozpakowywania.Odpowiedzi:
Użyj opcji
--absolute-names
lub-P
, aby wyłączyć tę funkcję.źródło
-C /
opcji opisanej w odpowiedzi @Marcus pozbędzie się komunikatu STDERR, jeśli jest to twój główny cel.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.źródło
tar
. Ta konkretna wiadomość powodowałatar
wyjście ze stanu1
, co powodowało, że otrzymywałem fałszywe powiadomienia e-mail o pomyślnych kopiach zapasowych, po prostu dlatego, żetar
pisał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]
-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 niecwd
z perspektywy użytkownika.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:
źródło
tar c -C / home/foo/*
), Ponieważ powłoka nie wie o zmienionym katalogu głównym. Ale wciąż dobra odpowiedź na inne przypadki.-C /
nie działa dla mnie kropka. Dla mnie to nie przeszkadza stderrowi.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.
Zamiast:
źródło
Jest to, jak zrobiłem to za pomocą metody brute force:
2>&1 | grep -v "Removing leading"
.Na przykład:
źródło
tar
polecenie może wrócić2
po błędzie krytycznym.Spróbuj użyć
-C
tylko ścieżki, która uniemożliwi kompresję pełnymi ścieżkami:źródło
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.źródło