1
votes

Comment extraire des fichiers à l'aide de caractères génériques dans un sous-répertoire spécifique

J'ai un fichier tar avec le contenu suivant:

$ tar -x -f ../mein.tar --wildcards  "*.jpg"

Il contient plusieurs sous-répertoires qui peuvent ou non contenir des fichiers jpg. Les noms de fichiers ne sont pas toujours les mêmes, mais je sais qu'il y a exactement un fichier jpg dans le répertoire «dir1». Je veux extraire ce fichier uniquement, aucun des autres fichiers jpg, ni dans dir2 ni dans dir1 / dir *.

Ce que j'ai essayé jusqu'à présent, c'est

$ tar -x -f ../mein.tar --wildcards --wildcards-match-slash 'dir1/*.jpg'
tar: dir1/*.jpg: Not found in archive
tar: Exiting with failure status due to previous errors


3 commentaires

avez-vous essayé './dir1/*.jpg' au lieu de 'dir1 / *. jpg' ? notez le ./ de début comme indiqué par tar tf


Le mien fonctionne bien tant que je ne le cite pas, même si mon chemin relatif ne trouve pas et ne développe pas le nom de fichier.


Cela ne fonctionne pas non plus: [vboxhain: / tmp / extract] $ tar -x -f ../mein.tar --wildcards './dir1/*.jpg' crée les fichiers suivants < code> ./ dir1 / dir11 / file111.jpg ./dir1/dir11/file112.jpg ./dir1/dir21/file122.jpg ./dir1/dir21/file121.jpg ./dir1/file11.jpg


3 Réponses :


-1
votes

Cela fonctionne

tar -xf mein.tar  dir1/*.jpg


5 commentaires

Cela n'utilisera-t-il pas le caractère générique de ligne de commande dans un fichier existant? Si le fichier n'existe pas déjà localement, le caractère générique échouera?


Cela échoue: [vboxhain: / tmp / extract] $ tar -x -f ../mein.tar --wildcards dir1 / *. Jpg tar: dir1 / *. Jpg: introuvable dans l'archive tar: Quitter avec état d'échec en raison d'erreurs précédentes


[vboxhain: / tmp / extract] $ tar -x -f ../mein.tar dir1 / *. jpg tar: caractères de correspondance de modèle utilisés dans les noms de fichier tar: utilisez --wildcards pour activer la correspondance de modèle, ou - -no-wildcards pour supprimer cet avertissement tar: dir1 / *. jpg: introuvable dans l'archive tar: sortie avec un état d'échec en raison d'erreurs précédentes


Quelle est votre version tar?


J'ai Ubuntu 16.04 LTS avec le tar suivant: [vboxhain: / tmp / extract] $ tar --version tar (GNU tar) 1.28



1
votes

Je vais vous proposer la voie canonique, utilisée à l'époque d'UNIX:

[...] ➤ tar tvf ../tar.tar
drwxr-xr-x .......        0 2019-01-15 10:33:31 dir1/
drwxr-xr-x .......        0 2019-01-15 10:21:14 dir1/dir11/
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir11/file111.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir11/file112.jpg
drwxr-xr-x .......        0 2019-01-15 10:21:14 dir1/dir21/
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir21/file121.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir21/file122.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:16 dir1/file11.jpg
drwxr-xr-x .......        0 2019-01-15 10:21:02 dir2/
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir2/file21.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:14 file1.jpg

[....] ➤ tar tf ../tar.tar|grep -E dir1/[a-zA-Z0-9]+.jpg$
dir1/file11.jpg

Cela fonctionnera indépendamment de Linux ou UNIX et aussi de la version de tar

Voici mon test:

tar xf ../mein.tar `tar tf ../mein.tar|grep -E dir1/[a-zA-Z0-9]+.jpg$`


4 commentaires

Désolé, cela ne fonctionne pas car le second tar ne donne aucune sortie. L'idée est bonne, mais le fichier tar a une taille d'environ 26 Go, et avec votre solution, je dois traiter le fichier deux fois, ce qui prend assez de temps.


Ce tar donne la sortie requise: tar tf ../mein.tar | sed -n -e '/[.[/.


@drhuh, veuillez vérifier ma réponse mise à jour. Et à mon humble avis, si vous ne voulez qu'un seul fichier, il est très difficile d'éviter la double navigation du fichier tar.


Oui, cela devrait fonctionner, mais avec tar tf au lieu de tar tvf .



0
votes

Vous devez utiliser --no-anchored comme ceci:

--anchored
    Patterns match file name start.

--no-anchored
    Patterns match after any / (default for exclusion).

--wildcards
    Use wildcards (default for exclusion).

--no-wildcards
    Verbatim string matching.

Selon le page de manuel :

Options de correspondance de nom de fichier

$ tar -xf ../mein.tar --wildcards --no-anchored  "dir1/*.jpg"

Voir aussi décompresser seulement un certain nombre de fichiers d'une grande archive tar


0 commentaires