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 Réponses :
Cela fonctionne
tar -xf mein.tar dir1/*.jpg
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
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$`
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
.
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
avez-vous essayé
'./dir1/*.jpg'
au lieu de'dir1 / *. jpg'
? notez le./
de début comme indiqué partar 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