créer une archive tar sans inclure le répertoire parent

63

J'essaie de créer un programme graphique pour mon script.

Dans le script, j'utilise tar pour créer une archive tar.

Le programme graphique me donne le nom complet du fichier pour lequel je veux créer une archive tar.

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

Mon archive tar comprend les noms home, username, dir1, dir2 et selecteddir, alors que je veux que tar ne crée que des archives comprenant selecteddir.

Sujit Maharjan
la source

Réponses:

79

Vous pouvez utiliser l' -Coption de tarpour accomplir ceci:

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

De la page de manuel de 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
la source
savez-vous comment je peux diviser $ chemin en selecteddir et chemin jusqu'à / home / nom_utilisateur / dir1 / dir2 pour que je puisse utiliser l'option -C
Sujit Maharjan
@SujitMaharjan vous pouvez utiliser dirnamepour tout extraire jusqu'à "selecteddir" et basenamepour extraire "selecteddir". Essayez les deux commandes avec le $ path comme argument.
mkc
2
Cela vaut la peine d’ajouter que cela est valable à la fois pour GNU et BSD Tar.
Luke Exton
5
Notez que vous ne pouvez pas utiliser Globbing avec l'option -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'ne fonctionnera pas.
Christian Long
Ne fonctionne pas: tar: selecteddir: stat Impossible: aucun fichier ou répertoire de ce type
tribbloïde
11

Vous pouvez utiliser deux méthodes pour aborder ce problème.

Le premier, à mon avis, est plus facile. Simplement cddans le répertoire directement au-dessus de celui que vous voulez compresser. Dans ce cas, ce serait dir2.

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

La deuxième façon consiste à utiliser l'option --transformqui prend une sedexpression et l'exécute en fonction des noms de fichiers. Remarque: vous devrez vous échapper /dans l' sedexpression.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'
ryanmjacobs
la source
La première méthode nécessite-t-elle un point (.) À la fin? Je l' ai essayé sans et obtenu: tar: Cowardly refusing to create an empty archive. Quand j'ai le point, cela fait que la racine contient un répertoire nommé .. Donc, proche mais pas parfait.
JW01
1
Suite à mon commentaire précédent. J'ai résolu mon problème. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *a travaillé pour moi. Utiliser un astérisque au lieu d'un point .. Mise à jour: Woops - Bien que j'ai perdu les fichiers cachés.
JW01
6

Tout d'abord, allez dans le répertoire de travail,

cd /your/working/directory/ 

Alors utilisez la magie *:-)

tar -cvf temp.tar *
Oui
la source
Je suis en train d'archiver les répertoires cachés et si je les ajouter directement (Non *) cela fonctionne, mais lorsque vous utilisez * il ajoute que le nom de l'archive à l'archive ...
Ole
2

En fait, j'ai trouvé un problème en utilisant la réponse de Ketan

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

Lorsque vous voulez simplement copier tous les fichiers dans dir2, seulement tous les fichiers, je commence par en venir à l’idée:

tar -C / home / nom d'utilisateur / dir1 / dir2 -cvf temp.tar *

Cependant, lorsque vous ne vous trouvez pas dans le répertoire dir2, cela poserait problème car * les fichiers tar seraient dans votre diectroy actuel. Et j'ai corrigé le problème en utilisant la commande ci-dessous:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./
Guan YANG
la source
7
Mais alors votre archive temp.tar contient .un dossier racine.
cgrim