Wie kann ich Dateien mit dem Befehl 'tar' in ein anderes Verzeichnis extrahieren?

672

Ich dachte, es tar archive.tar /users/mylocationwürde funktionieren, aber das tut es nicht. Wie kann ich das machen?

goovim
quelle
1
Auch -C, --directory DIR\n change to directory DIRsollte eher als beschrieben werden change output directory to DIR (will fail if DIR doesn't exist). Danke @Mich. Siehe auch @ Bryan_Larsens Antwort.
Gültig
1
@ Ujjwal Sing: In der Tat ist die Manpage tar nicht so hilfreich. Es beschreibt "-C DIR" als "in das Verzeichnis DIR wechseln". Noch schlimmer: "tar-C mein xf archive.tar" funktioniert nicht, während "tar-C mein xf archive.tar" funktioniert.
Pat Morin
@PatMorin Um fair zu sein: Wenn Sie die Argument-Aufruf-Konventionen verstanden haben, ist dies sinnvoll. Sie können auch tar xfC archive.tar mydiroder tun tar -C mydir -xf archive.tar. Es ist nur das Mischen von Flaggen im traditionellen Stil und im GNU-Stil, das die Dinge bricht, wie es ehrlich gesagt erwartet wird. Herkömmliche Flags werden als erstes Argument als ein Blob übergeben. Sie können nicht erwarten, dass sie funktionieren, wenn sie nicht die ersten sind. (Ich meine, ja, es ist sowieso möglich, es zu interpretieren - mein Punkt ist, dass es darüber hinaus geht, nicht Standard)
Nic Hartley

Antworten:

958

Verwenden Sie zum Extrahieren eines Archivs in ein anderes Verzeichnis als das aktuelle die Option, -Coder --directory, tar, wie in

tar -xf archive.tar -C /target/directory

Beachten Sie, dass das Zielverzeichnis vorhanden sein muss, bevor Sie diesen Befehl ausführen (er kann erstellt werden von mkdir /target/directory).

Weitere Optionen finden Sie auf der Handbuchseite (Befehl man tar:).

Wesley Reis
quelle
Kann der Pfad entfernt werden: dh einfach die Datei
abrufen
3
Wenn es sich um eine größere Datei handelt, erhalten Sie beim Ausführen des Befehls nur einige Sekunden oder sogar Minuten lang keine Ausgabe, während der Befehl ausgeführt wird. Sie können dies beheben, indem Sie das -vFlag ( ausführlicher Modus ) hinzufügen, das den Namen jeder Datei beim Extrahieren auflistet.
IQAndreas
Wenn Sie Probleme damit haben, beachten Sie auch den --strip-components=1Rat der anderen Antwort.
DreadPirateShawn
9
@consultstan xkcd.com/1168
Duncan X Simpson
9
Ist es nicht erstaunlich, dass es nach all den Jahren, in denen sich alle Optionen tarangesammelt haben, immer noch keine Option gibt , das Ausgabeverzeichnis zu erstellen, wenn es nicht existiert ?
EM0
261

Beachten Sie: Wenn Ihr Archiv bereits einen Verzeichnisnamen enthält, den Sie ändern möchten, fügen Sie die folgende --strip-components=1Option hinzu:

tar xf archive.tar -C /target/directory --strip-components=1
Bryan Larsen
quelle
2
Danke. Downloads über wget / etc haben immer ein übergeordnetes Verzeichnis. Dies ist die vollständige Antwort imo - oder sollte in Antwort oben vermerkt werden.
bshea
Genau das, wonach ich gesucht habe. --strip-componentsist sehr nützlich, wenn Sie Provisioner ausführen, die möglicherweise unterschiedliche Versionen verwenden. Dies /target/directorykann ein generischer Name sein, ohne sich Gedanken darüber machen zu müssen, wie der Anbieter seinen Archivordner benannt hat.
Jack_Hu
30

Die vorherigen Antworten und Kommentare kombinieren:

So extrahieren Sie einfach den Inhalt und erstellen ein Zielverzeichnis, falls es fehlt:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

So extrahieren und entfernen Sie das Stammverzeichnis (erste Ebene) in der ZIP-Datei

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1
Thamme Gowda
quelle
20

Eine andere Option ist --one-top-level. Dadurch wird automatisch ein Verzeichnis erstellt, das auf dem Dateinamen des Originals basiert.

tar zxvf filename.tgz --one-top-level

Wenn Sie möchten, können Sie auch Ihre eigene angeben, und tar erstellt sie automatisch.

tar zxvf filename.tgz --one-top-level=new_directory
Dean Householder
quelle
3
Ich verwende GNU tar 1.26 und bekomme einen unbekannten Optionsfehler für--one-top-level
Emma Strubell
Das ist die Antwort, die ich brauchte. Sehr nützlich, um den Verzeichnisnamen nicht angeben zu müssen, oder um sich einen speziellen Code zu merken, der auf die Datei für den Namen verweist. Danke.
Heuchler
2

Was ich in Bezug auf die Extraktion interessant fand, ist, dass es davon abhängt, wie Sie das Archiv erstellt haben, siehe dieses Beispiel

cd /tmp
mkdir folder
touch folder/file.txt

Wenn Sie dies tun, ist tar -zcvf folder.tar.gz folderalles wie erwartet = Wenn Sie es jetzt entpacken, wird es entpackt (Ordner wird erstellt, wenn Sie es entfernt haben) als /tmp/folder/.

Wenn Sie jedoch tar as erstellen tar -zcvf tmp-folder.tar.gz /tmp/folderund es im Ordner / tmp entpacken, ist das Ergebnis /tmp/tmp/folderdirectory! In diesem Fall müssen Sie es enttarieren, um / -tar -xf tmp-folder.tar.gz -C /

Betlista
quelle
1

Mit tar 1.29 können wir einfach den Verzeichnisnamen nach dem tar-Dateinamen hinzufügen. Zum Beispiel,

tar zxvf tar-file directory-name/
Shunmuga priyan Selvaraju
quelle