Erstellen eines Tar-Archivs ohne Einbeziehung des übergeordneten Verzeichnisses, wenn Dateien in verschiedenen Verzeichnissen gespeichert werden

11

Ich habe die folgenden vier Dateien im Dateisystem:

/home/martin/cvs/ops/cisco/b/s1
/home/martin/cvs/ops/cisco/b/s2
/home/martin/cvs/ops/extreme/b/r3
/home/martin/cvs/ops/j/b/r5

Ich muss diese Dateien in ein Tar-Archiv einfügen, möchte aber keine Verzeichnisse hinzufügen. Das Beste, was ich mir einfallen lassen konnte, war:

tar -C ~/cvs/ops/ -czvf archive.tgz cisco/b/s1 cisco/b/s2 extreme/b/r3 j/b/r5

Dies ist immer noch nicht perfekt, da jede Datei im Archiv zwei Verzeichnisse tief ist. Gibt es einen besseren Weg? Oder muss ich einfach kopieren s1, s2, r3und r5Dateien in einem Verzeichnis und erstellen Sie das Archiv mit tar -czvf archive.tgz s1 s2 r3 r5?

Martin
quelle

Antworten:

17

Sie können -Cmehrere Male verwenden (von einem Verzeichnis in ein anderes wechseln):

tar czvf archive.tar.gz -C /home/martin/cvs/ops/cisco/b s1 s2 -C ../../extreme/b r3 -C ../../j/b r5

Beachten Sie, dass jede -COption zu diesem Zeitpunkt relativ zum aktuellen Verzeichnis interpretiert wird (oder Sie können nur absolute Pfade verwenden).

Stephen Kitt
quelle
11

Wenn Sie die Liste der Dateien in einer Datei haben oder diese mit einem Befehl generieren können, können Sie einen einzelnen GNU tar-Befehl verwenden:

tar cf foo.tar -T list-of-files --transform 's:.*/::'

Die Transformation behält weiterhin Verzeichnisse bei, glättet jedoch das Layout vollständig. Sie benötigen also eine Möglichkeit, Verzeichnisse zu filtern, daher ist eine Liste von Dateien erforderlich.

muru
quelle
8

Sie können Dateien einzeln an das Archiv anhängen:

tar cf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s1
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s2
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/extreme/b r3
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/j/b r5

Sie können dies skripten, um es einfacher zu machen: Führen Sie für jeden Pfad tar rfdas Basisverzeichnis als Wert für den -CParameter und den Basisdateinamen aus, ohne dass ein Pfad hinzugefügt werden muss.

Janos
quelle