Erstellen eines Tar-Archivs ohne Einbeziehung des übergeordneten Verzeichnisses

62

Ich versuche ein grafisches Programm für mein Skript zu erstellen.

Innerhalb des Skripts benutze ich tar, um ein tar-Archiv zu erstellen.

Aus dem Grafikprogramm erhalte ich den vollständigen Namen der Datei, die ich ein Tar-Archiv erstellen möchte.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Mein tar-Archiv enthält home, username, dir1, dir2 und selecteddir, während ich möchte, dass tar nur Archive einschließlich selecteddir erstellt.

Sujit Maharjan
quelle

Antworten:

79

Sie können die -COption verwenden tar, um dies zu erreichen:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

Aus der Manpage von tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.
mkc
quelle
Weißt du, wie ich $ path in selecteddir und path bis zu / home / username / dir1 / dir2 aufteilen kann, damit ich die Option Benutzer-C verwenden kann?
Sujit Maharjan
@SujitMaharjan können Sie verwenden dirname, um alles bis "selecteddir" und "selecteddir" basenamezu extrahieren. Probieren Sie die beiden Befehle mit dem Argument $ path aus.
mkc
2
Es lohnt sich hinzuzufügen, dass dies sowohl für GNU als auch für BSD Tar gilt.
Luke Exton
5
Beachten Sie, dass Sie Globbing nicht mit der Option -C verwenden können. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'wird nicht funktionieren.
Christian Long
Funktioniert nicht: tar: selecteddir: Kann nicht angeben: Keine solche Datei oder kein solches Verzeichnis
tribbloid
11

Es gibt zwei Methoden, mit denen Sie dieses Problem angehen können.

Der erste ist meiner Meinung nach einfacher. Einfach cdin das Verzeichnis direkt über dem, das Sie komprimieren möchten. In diesem Fall wäre es dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

Die zweite Möglichkeit besteht darin, die Option zu verwenden, --transformdie einen sedAusdruck aufnimmt und gegen die Dateinamen ausführt. Hinweis: Sie müssen /den sedAusdruck mit einem Escapezeichen versehen.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'
ryanmjacobs
quelle
Benötigt die erste Methode am Ende einen Punkt (.)? Ich versuchte es ohne und bekam: tar: Cowardly refusing to create an empty archive. Wenn ich den Punkt habe, macht es ärgerlich, dass der Stamm ein Verzeichnis mit dem Namen enthält .. Also, nah aber nicht perfekt.
JW01
1
Weiter zu meinem vorherigen Kommentar. Ich habe mein Problem gelöst. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *arbeitete für mich. Verwenden eines Sternchens anstelle eines Punkts .. Update: Woops - Obwohl ich die versteckten Dateien verloren habe.
JW01
6

Wechseln Sie zunächst in das Arbeitsverzeichnis.

cd /your/working/directory/ 

Dann benutze Magie *:-)

tar -cvf temp.tar *
Ja
quelle
Ich versuche versteckte Verzeichnisse zu archivieren und wenn ich sie direkt hinzufüge (Nein *), funktioniert es, aber wenn ich * benutze, wird nur der Name des Archivs zum Archiv hinzugefügt ...
Ole
1

Eigentlich fand ich ein Problem mit Ketans Antwort

tar -C / home / benutzername / dir1 / dir2 -cvf temp.tar selecteddir

Wenn du nur alle Dateien nur in dir2 kopieren willst, nur alle Dateien dann komme ich zuerst auf die Idee:

tar -C / home / benutzername / dir1 / dir2 -cvf temp.tar *

Wenn Sie sich jedoch nicht im Verzeichnis dir2 befinden, kann dies zu Problemen führen, da * in Ihrem aktuellen Diectroy TAR-Dateien enthalten sind. Und ich habe das Problem mit dem folgenden Befehl behoben:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./
Guan YANG
quelle
6
Aber dann enthält dein temp.tar- Archiv .als Root-Ordner.
Cgrim