web-dev-qa-db-fra.com

Extraire un dossier spécifique de l'archive dans un dossier spécifique

J'ai créé une archive sur Ubuntu 14.04 avec:

cd /tmp
tar -cfvz archive.tar.gz /folder

Maintenant, je veux extraire un dossier spécifique dans l'archive (qui, à l'intérieur, se trouve dans /tmp) dans un dossier spécifique:

cd /tmp
tar -xfvz archive.tar.gz folder/in/archive -C /tmp/archive

Le résultat devrait être un nouveau dossier dans /tmp appelé archive. Est-ce correct? En particulier la barre oblique manquante (chemin relatif) du dossier à extraire et le chemin absolu avec la barre oblique du dossier à créer?

3
musbach

Tl; dr

Puisque vous êtes déjà dans /tmp, vous pouvez simplement ignorer l'option -C (étant donné que par défaut tarextraira les fichiers du répertoire de travail en cours) et ajoutez simplement --strip-components=2:

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive

GNU tarenregistre par défaut les chemins relatifs.

Vous pouvez vérifier si une archive utilise des chemins d'accès relatifs en exécutant tar -tf archive | head -n 1, ce qui affichera le chemin d'accès au premier fichier de l'archive; si le chemin de ce fichier est un chemin relatif, tous les fichiers de l'archive utilisent des chemins relatifs:

% tar -tf bash-4.3.tar.gz | head -n 1
bash-4.3/

Pour extraire un fichier/dossier d'une archive qui utilise des chemins relatifs sans ses ancêtres dans un chemin relatif, vous aurez besoin de deux options: -C et --strip-components=N: dans l'exemple ci-dessous, l'archive bash-4.3.tar.gz utilise des chemins relatifs et contient un fichier bash-4.3/doc/bash.html qui est extrait. dans un chemin relatif path(-C indique le répertoire dans lequel extraire les fichiers, --strip-components=2 indique que le parent et le parent du parent des fichiers extraits doivent être ignorés, de sorte que, dans ce cas, seul bash.html sera extrait dans le répertoire cible) :

% tree
.
├── bash-4.3.tar.gz
└── path

1 directory, 1 file
% tar -tf bash-4.3.tar.gz | grep -F 'bash.html'
bash-4.3/doc/bash.html
% tar -C path --strip-components=2 -zxf bash-4.3.tar.gz bash-4.3/doc/bash.html
% tree
.
├── bash-4.3.tar.gz
└── path
    └── bash.html

1 directory, 2 files

Donc, revenons à votre commande, puisque vous êtes déjà dans /tmp, vous pouvez simplement ignorer l'option -C (puisque par défaut tarextraira les fichiers du répertoire de travail en cours) et ajoutez simplement --strip-components=2:

tar --strip-components=2 -xfvz archive.tar.gz folder/in/archive
7
kos

tarstocke les chemins relatifs

Si vous avez besoin d'extraire un dossier particulier, regardez ce qu'il y a dans le fichier tar:

tar -tvf archive.tar.gz

Et notez le nom de fichier exact. tar -xvf foo.tar folder/in/archive
# Remarque: pas de barre oblique

1
daumie