Decomprimere solo un determinato numero di file da un tarball di grandi dimensioni


12

Ho un tarball di grandi dimensioni che è impegnato in FTP da un sistema remoto al nostro sistema locale.

Voglio sapere se è possibile iniziare la decompressione, diciamo 50 file alla volta in modo che tali file possano iniziare l'elaborazione durante il trasferimento.

Risposte:


12

Ecco una spiegazione dettagliata di come è possibile estrarre file specifici da un archivio. In particolare il tar GNU può essere usato per estrarre un singolo o più file da un tarball. Per estrarre membri specifici dell'archivio, fornire i loro nomi esatti come argomenti.

Per esempio:

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

È inoltre possibile estrarre quei file che corrispondono a un modello di globbing specifico (caratteri jolly). Ad esempio, per estrarre da cbz.tar tutti i file che iniziano con pic, indipendentemente dal prefisso della directory, è possibile digitare:

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

Per estrarre tutti i file php, inserisci:

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

Dove,

-x: indica a tar di estrarre i file.
-f: specifica il nome file / tarball.
-v: Dettagliato (mostra i progressi durante l'estrazione dei file).
-j: filtra l'archivio tramite bzip2, usa per decomprimere i file .bz2.
-z: filtra l'archivio tramite gzip, usa per decomprimere i file .gz.
--wildcards: indica a tar di trattare gli argomenti della riga di comando come schemi globbing.
--no-anchored: informa che i modelli si applicano ai nomi dei membri dopo qualsiasi / delimitatore.


3
Non voglio estrarre file specifici. Voglio solo estrarre i primi 50 file poiché non so quali siano i nomi dei file.
Pieter van Niekerk,

4
Puoi ottenere un elenco dei nomi di file usando "tar -tf", prendere i primi 50 usando "head", quindi inserire tale elenco in un altro comando tar come elenco di nomi di file da estrarre. In questo modo: "tar -xf file.tar --no-anchor" tar -tf file.tar | head -50` "
Simon Hibbs

È abbastanza possibile (nei miei test) estrarre un cinquantesimo file parzialmente trasferito. Sarebbe una buona idea evitare di estrarre l'ultimo (attuale) file -tnell'elenco fino a quando il tarball non viene scaricato completamente. In qualsiasi momento, l'elenco mostra solo i nomi dei file che sono stati o sono stati trasferiti, ad es. non l' elenco completo ; fino a quando non è completamente scaricato.
Peter

2

Non ho provato questo da solo, ma che ne dici di questo:

tar xvf archive.tar | head -n50

Tar invia una riga a STDOUT per ogni file estratto, quindi il headcomando ucciderà la pipe dopo 50 righe. Alla morte della pipa, mi aspetto che muoia anche il catrame.


Mi dispiace, quello ovviamente dovrebbe essere un head. Vorrei cambiare la mia risposta.
jippie,

Non ho controllato, ma temo che a causa del buffer della pipe, tarpotrebbe estrarre più di 50 file prima che sia SIGPIPEd, e in particolare potrebbe estrarre l'ultimo file incompleto.
Gilles 'SO- smetti di essere malvagio' il

2
tar -tvf tarfile.tar

ti dà l'intero elenco di file in tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Questo comando ripristina il fileToRestore

Per decomprimere più file, ma non tutti è possibile:

  • Metti tutto l'elenco dei file da tarfile.tarintar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Ora tar.txtha l'intero elenco di file tarfile.tar e puoi lasciare solo i file che vuoi ripristinare o con head ...

    head -n50 tar.txt > tar2.txt
    

È possibile inserire queste righe in un file

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

O il file di script completo:

#!/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 ""

E questo è tutto


2
Deve essere dolorosamente lento per chiamare il comando tar in un ciclo. Legge l'intero file ogni volta, giusto?
swdev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.