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?
Puisque vous êtes déjà dans /tmp
, vous pouvez simplement ignorer l'option -C
(étant donné que par défaut tar
extraira 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 tar
enregistre 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 tar
extraira 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
tar
stocke 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