Es ist kein Problem. Sie möchten keine führenden Schrägstriche in einem Teerarchiv. Ernsthaft. Wenn Sie ein Archiv in Ihr Systemstammverzeichnis extrahieren möchten, geben Sie dies -C /beim Extrahieren an.
ThiefMaster
Antworten:
69
Verwenden Sie die Option --absolute-namesoder -P, um diese Funktion zu deaktivieren.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
Dies ist die richtige Antwort. Beachten Sie jedoch, dass dies in den meisten Fällen nicht der Fall ist , da dies zu einem Archiv führt, das in vollständigen Pfaden extrahiert wird.
Rubo77
8
Wenn Sie die -C /in @Marcus 'Antwort beschriebene Option verwenden, wird die STDERR-Nachricht entfernt, wenn dies Ihr primäres Ziel ist.
Matt Sanders
1
Wie @ rubo77 kommentierte, ist dies normalerweise nicht das erwartete Ergebnis des Befehls.
Alfredocambera
3
Meistens ist dies nicht das, was ein Benutzer möchte, einfach weil die meisten von ihnen das Handbuch nicht lesen, bis sie es brauchen (niemand hat Zeit dafür). Es wäre also ratsam, zumindest Ihre Antwort zu erweitern und die Leute davor zu warnen, es sei denn, sie sind sich absolut sicher, dass sie verstehen, was die Wirkung davon ist. Besonders als Antwort akzeptiert zu werden.
Mladen B.
1
@Toskan Beispiele hinzugefügt
Barmar
89
Das ist eigentlich eine Funktion, kein Problem. Archive mit absoluten Standorten sind ein Sicherheitsrisiko. Angreifer könnten solche Archive verwenden, um Benutzer dazu zu verleiten, Dateien an kritischen Systemstandorten zu installieren.
Ja, du könntest es gebrauchen -P. Aber was ist falsch daran, dass tar den Schrägstrich entfernen darf und der Benutzer des Archivs lediglich die Extraktion explizit im Stammverzeichnis ausführen muss? Dann wirken sie sich bewusst auf kritische Systemstandorte aus und können dies nicht aus Versehen tun.
Manchmal sind Funktionen Probleme. Ich habe diesen Thread gefunden, nachdem ich ein Backup-Skript eingerichtet habe, das eine E-Mail mit einem Exit-Status ungleich Null von versendet tar. Diese bestimmte Nachricht wurde tarmit dem Status beendet 1, was dazu führte, dass ich bei erfolgreichen Sicherungen falsche E-Mail-Warnungen erhielt, einfach weil tardiese Nachricht an STDERR geschrieben wurde. Ich habe dieses Problem behoben, indem ich meine eigene optimierte Version von @ Marcus 'Lösung verwendet habe:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
rubynorails
1
Ich denke, es gibt einige Anwendungsfälle für die Verwendung -P- zum Beispiel, wenn Sie eine Art Dateisystem-Snapshot-Funktion in FUSE bereitstellen. In manchen Fällen möchten Sie möglicherweise einen Snapshot in einem bestimmten Verzeichnis entpacken und nicht cwdaus Sicht des Benutzers.
DIMMSum
81
Wenn Sie loswerden wollen „leading Entfernen` /‘von Mitgliedsnamen“ zu STDERR gedruckt werden, aber immer noch wollen , diese Schrägstriche wie Teer weise standardmäßig tut verlassen, sah ich eine hervorragende Lösung hier durch Kommentator timsoft.
Die Lösung besteht darin, mit der Option -C das Verzeichnis in das Stammverzeichnis (/) zu ändern und dann den zu archivierenden Dateibaum ohne einen führenden Schrägstrich anzugeben , da Sie jetzt nur einen relativen Pfad benötigen. Dies funktioniert genauso wie ein normaler Befehl zum Erstellen von Tar, es ist jedoch kein Strippen erforderlich:
Bei inkrementellen Sicherungen funktioniert dies nicht. Aber eine gute Antwort.
Gajdipajti
Es funktioniert auch nicht, wenn Sie Dateien tarieren möchten, die durch Shell-Erweiterung gekennzeichnet sind (z. B. tar c -C / home/foo/*), da die Shell nichts über das geänderte Root-Verzeichnis weiß. Aber immer noch eine gute Antwort für andere Fälle.
Boris
1
-C /funktioniert bei mir nicht, Punkt. Das hindert mich nicht daran.
Acumenus
3
@ABB Vergewissern Sie sich, dass der Pfad nach -C / relativ ist.
Zurfyx
Funktioniert dieser Ansatz, wenn ein Benutzer keine Berechtigungen für das Stammverzeichnis hat?
Mladen B.
31
Einen Monat zu spät, aber ich fand die geeignetste Lösung für meinen Fall (in einem Shell-Skript) darin, in das übergeordnete Verzeichnis zu wechseln und den Befehl dort auszuführen.
In der Tat hätten Sie es tun können mit: tar -zcvf mysite.gz -C / var / www / mysite / Der Vorteil ist, dass Sie es von jedem Verzeichnis ausführen können
alfredocambera
Danke für deine Hilfe. Das habe ich gebraucht. Ich wollte nicht den vollständigen Pfad in meinem Tarball, sondern nur den Zielordner.
Christia
Dies hätte wahrscheinlich als richtige Antwort akzeptiert werden müssen, denke ich.
Mladen B.
Ich verstehe nicht, wie dies die Frage überhaupt beantwortet. Es ist etwas anderes, das getan werden könnte. ……… Wie: F: Wie komme ich von Los Angeles nach New York? A: Geh stattdessen nach San Francisco.
G-Man
Ich stimme @ G-Man zu. Dies führt zu einer tar-Datei mit einer völlig anderen Verzeichnisstruktur. In einigen Fällen ist diese Verzeichnisstruktur in erster Linie besser geeignet, aber sie beantwortet die Frage nicht.
Kevin Keane
7
Dies ist , wie ich es tat durch Brute - Force - Methode verwendet: 2>&1 | grep -v "Removing leading".
Das Problem dabei ist, dass der Fehlercode ausgeblendet wird. Wenn Sie also den Fehlercode von tar in einem Bash-Skript überprüfen möchten, wird bei Erfolg keine 0 zurückgegeben.
Brian
@staticx, der Fehlercode ist 0, unabhängig davon.
Acumenus
1
@ABB Mein tarBefehl wird möglicherweise 2bei einem schwerwiegenden Fehler zurückgegeben.
Auf diese Weise versuchen Sie nicht, in erster Linie absolute Pfade in das tar-Archiv einzufügen. Wenn Sie es im Stammverzeichnis des Dateisystems entpacken möchten, müssen Sie nur
cd / && tar xzf backupt.tar.gz nach der Übertragung.
-C /
beim Extrahieren an.Antworten:
Verwenden Sie die Option
--absolute-names
oder-P
, um diese Funktion zu deaktivieren.quelle
-C /
in @Marcus 'Antwort beschriebene Option verwenden, wird die STDERR-Nachricht entfernt, wenn dies Ihr primäres Ziel ist.Das ist eigentlich eine Funktion, kein Problem. Archive mit absoluten Standorten sind ein Sicherheitsrisiko. Angreifer könnten solche Archive verwenden, um Benutzer dazu zu verleiten, Dateien an kritischen Systemstandorten zu installieren.
Ja, du könntest es gebrauchen
-P
. Aber was ist falsch daran, dass tar den Schrägstrich entfernen darf und der Benutzer des Archivs lediglich die Extraktion explizit im Stammverzeichnis ausführen muss? Dann wirken sie sich bewusst auf kritische Systemstandorte aus und können dies nicht aus Versehen tun.quelle
tar
. Diese bestimmte Nachricht wurdetar
mit dem Status beendet1
, was dazu führte, dass ich bei erfolgreichen Sicherungen falsche E-Mail-Warnungen erhielt, einfach weiltar
diese Nachricht an STDERR geschrieben wurde. Ich habe dieses Problem behoben, indem ich meine eigene optimierte Version von @ Marcus 'Lösung verwendet habe:cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
- zum Beispiel, wenn Sie eine Art Dateisystem-Snapshot-Funktion in FUSE bereitstellen. In manchen Fällen möchten Sie möglicherweise einen Snapshot in einem bestimmten Verzeichnis entpacken und nichtcwd
aus Sicht des Benutzers.Wenn Sie loswerden wollen „leading Entfernen` /‘von Mitgliedsnamen“ zu STDERR gedruckt werden, aber immer noch wollen , diese Schrägstriche wie Teer weise standardmäßig tut verlassen, sah ich eine hervorragende Lösung hier durch Kommentator timsoft.
Die Lösung besteht darin, mit der Option -C das Verzeichnis in das Stammverzeichnis (/) zu ändern und dann den zu archivierenden Dateibaum ohne einen führenden Schrägstrich anzugeben , da Sie jetzt nur einen relativen Pfad benötigen. Dies funktioniert genauso wie ein normaler Befehl zum Erstellen von Tar, es ist jedoch kein Strippen erforderlich:
quelle
tar c -C / home/foo/*
), da die Shell nichts über das geänderte Root-Verzeichnis weiß. Aber immer noch eine gute Antwort für andere Fälle.-C /
funktioniert bei mir nicht, Punkt. Das hindert mich nicht daran.Einen Monat zu spät, aber ich fand die geeignetste Lösung für meinen Fall (in einem Shell-Skript) darin, in das übergeordnete Verzeichnis zu wechseln und den Befehl dort auszuführen.
Anstatt von:
quelle
Dies ist , wie ich es tat durch Brute - Force - Methode verwendet:
2>&1 | grep -v "Removing leading"
.Zum Beispiel:
quelle
tar
Befehl wird möglicherweise2
bei einem schwerwiegenden Fehler zurückgegeben.Versuchen Sie,
-C
nur für den Pfad zu verwenden, um die Komprimierung mit vollständigen Pfaden zu verhindern:quelle
Ich habe dieses Problem gelöst mit:
cd /home/foo && tar czf ~/backup.tar.gz .
Auf diese Weise versuchen Sie nicht, in erster Linie absolute Pfade in das tar-Archiv einzufügen. Wenn Sie es im Stammverzeichnis des Dateisystems entpacken möchten, müssen Sie nur
cd / && tar xzf backupt.tar.gz
nach der Übertragung.quelle