décompressez «tar» mais changez le nom du répertoire vers lequel extraire

26
tar -tf filename.tar
folder1/file
folder1/name
[...]

Je voudrais extraire le fichier et le nom du dossier2 . Est-ce que cela peut être fait en une seule ligne?

Felipe Alvarez
la source

Réponses:

35

Utilisez -Cet --strip-components(Voir man tar).

Exemple:

mkdir FOLDER
# for remote tar file
curl -L ’remote_tar_file' | tar -xz - -C FOLDER --strip-components=1

# for local tar file
tar -xzf FILENAME -C FOLDER --strip-components=1

Explication:

L' -Cindicateur suppose qu'un répertoire est déjà en place afin que le contenu du fichier tar puisse y être développé. d'où le mkdir FOLDER.

Le --strip-componentsdrapeau est utilisé lorsqu'un fichier tar se développerait naturellement dans un dossier, disons, comme github où il donne des exemples dans un repo-name-masterdossier. Bien sûr, vous n'auriez pas besoin du dossier de premier niveau généré ici, donc --strip-componentsréglé sur 1supprimerait automatiquement ce premier dossier pour vous. Plus le nombre est élevé, plus les dossiers imbriqués sont supprimés.

Marian
la source
J'ai lu man tar. Je n'ai pas repéré --strip-components. belle
Felipe Alvarez
1
tar-1.14 utilise --strip-path, tar-1.14.90 + utilise --strip-components. Peut-être un problème ici?
Mikhail Moskalev le
Je voterais favorablement si cela donnait un exemple et pas seulement les commutateurs, comme l' indique le manuel en ligne , 3 styles d'arguments donnent lieu à confusion.
Iain
J'ai oublié le -f sur tar -xz, pense-je. Échoué pour moi. Je pensais que j'utilisais ça sans raison pendant tout ce temps ...
John Carrell
17

Vous pouvez également utiliser l' --transformoption pour un peu plus de flexibilité. Il accepte toute opération de remplacement de sed.

Par exemple, voici comment extraire une archive tar Linux dans un nouveau répertoire afin que je puisse appliquer un patch:

tar -xjf linux-2.6.38.tar.bz2 --transform 's/linux-2.6.38/linux-2.6.38.1/'
À M
la source