Ne décompressez qu'un certain nombre de fichiers d'une grande archive tar

12

J'ai une grande archive tar qui est occupée par FTP à partir d'un système distant vers notre système local.

Je veux savoir s'il est possible de démarrer le découplage, disons 50 fichiers à la fois afin que ces fichiers puissent commencer à être traités pendant le transfert.

Pieter van Niekerk
la source

Réponses:

12

Voici une explication détaillée sur la façon dont il est possible d'extraire des fichiers spécifiques d'une archive. Plus précisément, le tar GNU peut être utilisé pour extraire un ou plusieurs fichiers d'une archive tar. Pour extraire des membres d'archive spécifiques, donnez leurs noms de membres exacts comme arguments.

Par exemple:

tar --extract --file={tarball.tar} {file}

Vous pouvez également extraire les fichiers correspondant à un modèle de globalisation spécifique (caractères génériques). Par exemple, pour extraire de cbz.tar tous les fichiers commençant par pic, quel que soit leur préfixe de répertoire, vous pouvez taper:

tar -xf cbz.tar --wildcards --no-anchored 'pic*'

Pour extraire tous les fichiers php, entrez:

tar -xf cbz.tar --wildcards --no-anchored '*.php'

Où,

-x: demande à tar d'extraire les fichiers.
-f: spécifie le nom de fichier / nom de l'archive.
-v: Verbose (affiche la progression lors de l'extraction des fichiers).
-j: filtre l'archive via bzip2, permet de décompresser les fichiers .bz2.
-z: filtre les archives via gzip, permet de décompresser les fichiers .gz.
--wildcards: demande à tar de traiter les arguments de la ligne de commande comme des modèles de globalisation.
--no-anchored: l'informe que les modèles s'appliquent aux noms de membres après tout / délimiteur.

Eugene S
la source
3
Je ne veux pas extraire de fichiers spécifiques. Je veux juste extraire les 50 premiers fichiers car je ne sais pas quels sont les noms des fichiers.
Pieter van Niekerk
4
Vous pouvez obtenir une liste des noms de fichiers en utilisant "tar -tf", prendre les 50 premiers en utilisant "head", puis alimenter cette liste dans une autre commande tar en tant que liste des noms de fichiers à extraire. Comme ceci: "tar -xf file.tar - non ancré` tar -tf file.tar | head -50` "
Simon Hibbs
Il est tout à fait possible (lors de mes tests) d'extraire un 50e fichier partiellement transféré. Ce serait une bonne idée d'éviter d'extraire le dernier fichier (actuel) de la -tliste jusqu'à ce que l'archive tar soit complètement téléchargée. À tout moment, la liste affiche uniquement les noms de fichiers qui ont été ou sont en cours de transfert, c'est-à-dire. pas la liste complète ; jusqu'à ce qu'il soit entièrement téléchargé.
Peter.O
2

Je n'ai pas essayé cela moi-même, mais qu'en est-il:

tar xvf archive.tar | head -n50

Tar envoie une ligne à STDOUT pour chaque fichier extrait, puis la headcommande va tuer le tuyau après 50 lignes. À la mort du tuyau, je m'attendrais à ce que le goudron meure aussi.

jippie
la source
Désolé, cela devrait bien sûr être un head. Permettez-moi de changer ma réponse.
jippie
Je n'ai pas vérifié, mais je crains qu'en raison du tampon de canal, il tarpuisse extraire plus de 50 fichiers avant qu'il ne soit SIGPIPEd, et en particulier il puisse extraire le dernier fichier incomplet.
Gilles 'SO- arrête d'être méchant'
2
tar -tvf tarfile.tar

vous donne toute la liste des fichiers tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Cette commande restaure le fileToRestore

Pour décompresser plusieurs fichiers, mais pas tous, vous pouvez:

  • Vous mettez toute la liste des fichiers de tarfile.tardanstar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • A maintenant tar.txttoute la liste des fichiers tarfile.tar et vous ne pouvez laisser que les fichiers que vous souhaitez restaurer ou avec la tête ...

    head -n50 tar.txt > tar2.txt
    

Vous pouvez mettre ces lignes dans un fichier

cat tar.txt|while read line
do
   tar -xvf tarfile.tar ${line}
done

Ou le fichier de script complet:

#!/bin/bash

if [[ "$1" = "" || "$2" = "" ]]
   then
   echo ""
   echo "Uso: untar-list.sh tarfile.tar listfile.txt"
   echo ""
   exit 1
fi

tarfile=$1
file=$2

if [[ ! -f ${tarfile} ]]
   then
   echo ""
   echo "Archivo ${tarfile} no existe"
   echo ""
   exit 1
fi

if [[ ! -f ${file} ]]
   then
   echo ""
   echo "Archivo ${file} no existe"
   echo ""
   exit 1
fi

cat ${file}|while read line
do
  tar -xvf ${tarfile} ${line}
done

echo ""
echo "Finalizado"
echo ""

Et c'est tout

user84196
la source
2
Cela doit être douloureusement lent pour appeler la commande tar en boucle. Il lit le fichier entier à chaque fois, non?
swdev