.tar-Dateien ohne Verzeichnisstruktur


32

Ich .tarschreibe ein paar Dateien mit dem Pfad example/super_user/Output.*.

Das Ergebnis .tarsieht 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?


Vermeiden Sie Tarbomben mit solchen Archiven.
Grawity

teer - streifen-komponenten = 1000?
Zaar Hai

Antworten:


11

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:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

Befindet sich das Verzeichnis 'example' im Stammverzeichnis des Dateisystems, gehen Sie wie folgt vor:

tar -C /example/super_user -cvf result.tar .

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.


1
Dies ist die Antwort auf das vorliegende Problem. Die erwähnte Einschränkung ist in diesem Fall kein Problem. Alle anderen Antworten sind Problemumgehungen, um Variationen des Problems zu berücksichtigen.
Joki

Das ist in der Tat die Lösung für diese Frage. Das Verzeichnis muss nicht die Wurzel sein, die Verzeichnisstruktur angenommen /home/u/foo/bar, Richt Arbeits ist /home/b, dann tar -C foo/bar -cvf qiz.tar .gut funktioniert. Eine Einschränkung ist jedoch, dass Sie keine Platzhalter verwenden tar -C foo/bar -cvf qiz.tar *.logkönnen tar -C foo/bar -cvf qiz.tar "*.log"oder tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"nicht funktionieren.
Brice

1
Es ist zu beachten, dass Sie -Cmehrere Male in einem einzigen tarBefehl 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.
Zero298,

10

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:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

Um ein tar (ARCHIVE.tar) mit allen Dateien aus einem Verzeichnis (DIR) ohne übergeordnete Verzeichnisinformationen (nicht einmal ./) zu erstellen, können Sie Folgendes verwenden:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Sie können mit dem Fund spielen, um die Tiefe zu begrenzen, bestimmte Dateien auszuwählen und vieles mehr.

Viel Glück!


Ich erhalte den OSX-Befehl find: -printf: unknown primary or operator. Irgendwelche Tipps?
TCB13

-printfist 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").
Hennes

3

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.


1

Wenn dies der gesamte Inhalt des Tarballs ist, können Sie die --strip-componentsOption von GNU tar verwenden , um die beiden Ebenen vor den Dateien zu entfernen.


Ich habe nur die Option, --strip-pathaber die Verwendung ändert nichts.

1

Eine andere Möglichkeit, das Verzeichnis vorübergehend zu ändern, besteht darin, die Befehle cdund tarin Klammern zu setzen ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

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.. popdBlöcke oder Verfolgung, wohin cdzurück zu.


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd verschiebt den aktuellen Verzeichnispfad zum DIRStack und wechselt in den Inhaltsordner . Anschließend kehren Sie mit in das ursprüngliche Verzeichnis zurück popd.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.