Ich .tar
schreibe ein paar Dateien mit dem Pfad example/super_user/Output.*
.
Das Ergebnis .tar
sieht so aus:
+ example
+ super_user
- Output.zip
- Output.xml
- Output.txt
Aber ich möchte, dass die Datei wie folgt aussieht:
- Output.zip
- Output.xml
- Output.txt
Wissen Sie, wie ich dies erreichen kann, während ich mich noch in einem anderen Verzeichnis befinde?
unix
compression
tar
Der Hochstapler
quelle
quelle
Antworten:
tar behält die Datei- und Ordnerstruktur bei, sodass es meines Erachtens keine Möglichkeit gibt, tar anzuweisen, die Hierarchie beim Erstellen zu reduzieren.
Eine Problemumgehung besteht darin, das Verzeichnis vorübergehend zu ändern, den Teer zu erstellen und dann zurückzukehren - ein kurzes Beispiel unten:
quelle
Befindet sich das Verzeichnis 'example' im Stammverzeichnis des Dateisystems, gehen Sie wie folgt vor:
Dadurch wird das Verzeichnis zu dem Punkt geändert, an dem Sie den Teer ausführen möchten. Die Einschränkung besteht darin, dass die Verzeichnisstruktur für diese Unterverzeichnisse beibehalten wird, wenn sich unter / example / super_user Unterverzeichnisse befinden.
quelle
/home/u/foo/bar
, Richt Arbeits ist/home/b
, danntar -C foo/bar -cvf qiz.tar .
gut funktioniert. Eine Einschränkung ist jedoch, dass Sie keine Platzhalter verwendentar -C foo/bar -cvf qiz.tar *.log
könnentar -C foo/bar -cvf qiz.tar "*.log"
odertar -C foo/bar -cvf qiz.tar "foo/bar/*.log"
nicht funktionieren.-C
mehrere Male in einem einzigentar
Befehl verwenden können, wenn Sie mehrere Dateien hinzufügen müssen, die über mehrere Verzeichnisse verteilt sind, die TAR-Datei jedoch unverändert bleiben soll.Ich habe meine Antwort hier gepostet:
https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure
repost (für faule Leute)
Das ist hässlich ... aber es funktioniert ...
Ich hatte das gleiche Problem, aber mit mehreren Ordnern wollte ich einfach alle Dateien löschen. Sie können die Option "transform" verwenden, um einen sed-Ausdruck zu übergeben, und ... es funktioniert wie erwartet.
Das ist der Ausdruck:
's/.*\///g'
(alles vor '/' löschen)Dies ist der letzte Befehl:
quelle
Um ein tar (ARCHIVE.tar) mit allen Dateien aus einem Verzeichnis (DIR) ohne übergeordnete Verzeichnisinformationen (nicht einmal ./) zu erstellen, können Sie Folgendes verwenden:
Sie können mit dem Fund spielen, um die Tiefe zu begrenzen, bestimmte Dateien auszuwählen und vieles mehr.
Viel Glück!
quelle
-printf
ist ein nicht standardmäßiger Befehl. Viele davon funktionieren nur mit bestimmten Versionen von find. Normalerweise markieren wir diese beim Beantworten einer Frage auf Super User (zB mit "-blah ist eine Gnu-Erweiterung und wird nicht überall funktionieren").Ich habe ein temporäres Verzeichnis erstellt. Und in dem Verzeichnis erstellt symbolische Links zu allen Dateien zu den einzubeziehenden Dateien. Dann habe ich teer -h-c gemacht. damit alle Dateien (keine Links, sondern deren Inhalt) mit dem gewünschten Namen in das Archiv aufgenommen werden.
quelle
Wenn dies der gesamte Inhalt des Tarballs ist, können Sie die
--strip-components
Option von GNU tar verwenden , um die beiden Ebenen vor den Dateien zu entfernen.quelle
--strip-path
aber die Verwendung ändert nichts.Eine andere Möglichkeit, das Verzeichnis vorübergehend zu ändern, besteht darin, die Befehle
cd
undtar
in Klammern zu setzen(
)
:Dies hat den Vorteil, dass Sie immer implizit zum ursprünglichen Verzeichnis zurückkehren, wenn der Block fertig ist. dh keine Notwendigkeit für
pushd
..popd
Blöcke oder Verfolgung, wohincd
zurück zu.quelle
pushd verschiebt den aktuellen Verzeichnispfad zum
DIR
Stack und wechselt in den Inhaltsordner . Anschließend kehren Sie mit in das ursprüngliche Verzeichnis zurückpopd
.quelle