Stellen Sie sich eine einzelne TAR-Datei von einem externen System vor, die einige Verzeichnisse mit verschiedenen Attributen enthält, die ich beibehalten möchte, z. B. Berechtigungen, MTimes usw. Wie kann ich eine Teilmenge dieser Dateien als regulärer Benutzer (nicht als Root) verwenden?
Suchen Sie nach etwas wie:
tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz
Es ist auch wichtig, dass die Hauptattribute (Besitz, Gruppe, Modus, Mtime) in diesem Tar-Archiv erhalten bleiben. Was ist mit anderen Attributen in einer TAR-Datei wie erweiterten Header-Schlüsselwörtern ?
Bonuspunkte für eine Lösung, die die Verwendung eines temporären Verzeichnisses für den Fall vermeidet, dass dieses Unterverzeichnis sehr große Dateien enthält.
@original.tar
Ansatz mit bsdtar möglich war. Scheint auch mit erweiterten Attributen und Komprimierung zu arbeiten</var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz
(und aus irgendeinem Grund erzeugt eine leere Auswahl eine Reihe von Null-Bytes, aber das ist für mich kein großes Problem).s/old/new/
funktioniert dies nicht für Dateien, die mit @ old.tgz aus alten Archiven stammen, sondern nur für echte Dateien, die direkt aus dem Dateisystem archiviert werden. Es ist wirklich eine Schande, da es der nützlichste Anwendungsfall für mich wäre.Am einfachsten wäre es, das gesamte Archiv zu kopieren. Ich nehme an, du willst das nicht, weil es zu groß ist.
Die üblichen Befehlszeilentools (
tar
,pax
) unterstützen das Kopieren von Mitgliedern eines Archivs in ein anderes Archiv nicht.Wenn Sie die Inhaberschaft nicht beibehalten müssen, würde ich die Verwendung von FUSE- Dateisystemen vorschlagen . Mit archivemount können Sie ein Archiv als Dateisystem bereitstellen . Führen Sie dies für das Quellarchiv aus und führen Sie tar auf dem bereitgestellten Dateisystem aus.
Alternativ können Sie AVFS verwenden :
Alternativ können Sie
tar
das ursprüngliche Archiv ausführen und über SSHFS auf den Remotecomputer extrahieren .Alle diese Methoden sind jedoch umständlich, wenn Sie den Besitz behalten müssen. Bei allen handelt es sich um das Extrahieren in eine Datei auf dem lokalen Computer. Daher muss der Besitz dieser Datei der beabsichtigte Remote- Besitz sein. Dies erfordert die Ausführung als root und führt möglicherweise nicht zum gewünschten Ergebnis, wenn sich die Dateien im Besitz von Konten befinden, deren Namen oder IDs sich zwischen dem lokalen Computer und dem Remote-Host unterscheiden.
Die
tarfile
Bibliothek von Python bietet eine relativ einfache Möglichkeit, Tar-Mitglieder zu bearbeiten, sodass Sie sie von einer Tar-Datei in eine andere mischen können. Es unterstützt POSIX-Standardformate (ustar, pax) sowie einige GNU-Erweiterungen. Hier ist ein ungetestetes Python-Skript, das eine Tar-Datei (möglicherweise mit gzip oder bzip2 komprimiert) in der Standardeingabe liest und eine mit bzip2 komprimierte Tar-Datei in der Standardausgabe schreibt. Die Elemente aus der Quelle werden kopiert, wenn sie mit dem an das Skript übergebenen Argument beginnen.Aufruf als
quelle
Ein alternativer Ansatz ohne Berechtigungen besteht darin, mit dem
fakeroot
Programm so zu tun, als dürften Sie den Besitzer wechseln. Während andere tar-Attribute verloren gehen, bleiben Modus, mtime und uid / gid erhalten. Diese Befehle erstellen ein temporäres Verzeichnis, extrahieren eine Teilmenge der Dateien und erstellen schließlich ein neues Archiv:quelle
GNU
tar
hat eine--delete
Option:Auf diese Weise können Sie eine Teilmenge des Eingabetars abrufen, indem Sie angeben, was nicht in der Ausgabe enthalten sein soll.
Leider konnte ich nicht mit der
--exclude
Option arbeiten.--delete
Es scheint daher, dass Sie zuerst eine explizite Liste (-t
) der zu löschenden Elemente abrufen und diese dann an einen anderen Aufruf von übergeben müssentar
.Oder Sie können die Liste in einer externen Datei speichern, wenn sie zu lang oder zu komplex ist:
quelle
Soweit ich weiß, kann der
tar
Befehl das tar-Format nicht sowohl als Eingabe als auch als Ausgabe verwenden. Sie werden Ihre Dateien lokal irgendwie extrahieren müssen, und die Verwendung Teer wieder ein tarfile on-the-fly, mit so etwas zu schaffen (die-
Mittel standart Eingabe / Ausgabe anstelle einer Datei verwendet wird):Beachten Sie, dass
tar
die Möglichkeit, eine Tarfile direkt in eine andere Tarfile zu extrahieren, eine interessante Idee ist ...quelle