2
votes

Comment extraire uniquement les fichiers souhaités de tar.gz?

J'ai un fichier .tar.gz qui contient plusieurs dossiers en dessous. Chaque dossier a plusieurs fichiers et je veux seulement extraire le SNAPSHOT .jar de tous les dossiers qu'il a en dessous.

J'ai essayé d'utiliser des jokers mais ça n'aide pas. Ex:

    tar -xf samplejars.tar.gz --wildcards "*SNAPSHOT*.jar"

samplejars.tar.gz a de nombreux dossiers et je veux seulement extraire SNAPSHOT .jar. Comment faire?

Remarque: Tous les pots ont des noms uniques / différents.


1 commentaires

[P.S. La réponse à [cette] [1] question de l'utilisateur «ford» répond parfaitement à ma question] [1]: stackoverflow.com/questions/14295771/...


3 Réponses :


3
votes

Je l'ai testé avec la structure de dossiers suivante:

data/c/SNAPSHOT.jar
data/g/SNAPSHOT.jar

Le masque générique suivant fonctionne et extrait uniquement les fichiers correspondant exactement à SNAPSHOT.jar strong> pas SNAPSHOT.jar.with.extension et ANOTHER_SNAPSHOT.jar

tar -xf data.tar.gz --wildcards "*/SNAPSHOT.jar"

Résultat:

data/
data/a
data/a/ANOTHER_SNAPSHOT.jar
data/b
data/c
data/c/SNAPSHOT.jar
data/d
data/e
data/f
data/f/SNAPSHOT.jar.with.extension
data/g
data/g/SNAPSHOT.jar
data/h


3 commentaires

Merci Florian, cela aide dans une certaine mesure. Mais est-il possible d'extraire uniquement les fichiers JAR et non les dossiers de tar.gz? Comme, l'exemple de sortie de votre réponse a les deux SNAPSHOT.jars sous les dossiers data / c / et data / g /. Comment obtenir uniquement les fichiers .jars et non les dossiers?


En théorie, cela est possible. Certaines méthodes sont abordées dans cette question: stackoverflow.com/questions/14295771/... Le problème est que vous recherchez plusieurs bocaux portant le même nom. Par conséquent, ils ne peuvent pas être extraits dans le même dossier.


Merci Florian. Le lien que vous avez partagé m'a donné ce dont j'avais besoin.



0
votes

Vous pouvez créer un fichier avec le modèle que vous recherchez:

ANOTHER_SNAPSHOT.jar
SNAPSHOT.jar
SNAPSHOT-2.jar

Si vous avez plusieurs modèles, vous pouvez ajouter plusieurs lignes à votre fichier cible

tar -xf samplejars.tar.gz --files-from=filename --strip-components 2

Ensuite, vous pouvez utiliser le paramètre --files-from:

data/a/ANOTHER_SNAPSHOT.jar
data/c/SNAPSHOT.jar
data/g/SNAPSHOT-2.jar
data/g/SNAPSHOT.jar

J'ai testé avec

data/
data/a/
data/a/ANOTHER_SNAPSHOT.jar
data/b/
data/c/
data/c/SNAPSHOT.jar
data/d/
data/e/
data/f/
data/f/SNAPSHOT.jar.with.extension
data/g/
data/g/SNAPSHOT-2.jar
data/g/SNAPSHOT.jar
data/h/
Résultat
tar -xf samplejars.tar.gz --files-from=filename

Si tous les fichiers ont des noms de fichiers uniques, comme le dit l'OP, vous pouvez utiliser --strip-components pour supprimer le fichier structure

echo "*.md" >> target

Avec mes données, le résultat était:

echo "*SNAPSHOT*.jar" > target

Parce que je n'avais pas de noms uniques, l'un des Les fichiers SNAPSHOT.jar ont été écrasés à l'étape --strip-components.


2 commentaires

Merci @Dan Meigs, cela aide dans une certaine mesure. Mais est-il possible d'extraire uniquement les fichiers JAR et non les dossiers de tar.gz? Comme, l'exemple de sortie de votre réponse a les deux SNAPSHOT.jars sous les dossiers data / c / et data / g / etc. Comment puis-je obtenir uniquement les .jars et non les dossiers?


J'ai mis à jour ma réponse en fonction du lien fourni par @Florian Schlag



0
votes

Vous pouvez utiliser xargs pour cela:

find archive_root_dir -type f -exec mv -i {} . \;

Ensuite, pour déplacer tous les fichiers vers le répertoire racine

tar -tf data.tar.gz | grep SNAPSHOT.jar | xargs tar -xf data.tar.gz 


3 commentaires

Merci @ blue112, cela aide dans une certaine mesure. Mais est-il possible d'extraire uniquement les fichiers JAR et non les dossiers de tar.gz? Je veux dire, la commande que vous avez partagée fait ressortir la structure des dossiers de tar.gz. Pouvons-nous extraire uniquement les fichiers JAR de tar.gz et aucune structure de dossiers?


@Dhiraj Comment géreriez-vous deux pots nommés de la même manière?


Oh, j'ai oublié de le mentionner :) Les pots ont des noms uniques, donc ce n'est pas un problème.