Entpacken Sie nur eine bestimmte Anzahl von Dateien aus einem großen Archiv

12

Ich habe einen großen Tarball, der gerade mit dem FTP-Transfer von einem Remote-System zu unserem lokalen System beschäftigt ist.

Ich möchte wissen, ob es möglich ist, die Teeraufhebung zu starten. Sagen wir 50 Dateien gleichzeitig, damit diese Dateien verarbeitet werden können, während die Übertragung stattfindet.

Pieter van Niekerk
quelle

Antworten:

11

Hier finden Sie eine detaillierte Erklärung, wie Sie bestimmte Dateien aus einem Archiv extrahieren können. Speziell GNU tar kann verwendet werden, um eine oder mehrere Dateien aus einem Tarball zu extrahieren. Um bestimmte Archivmitglieder zu extrahieren, geben Sie ihre genauen Mitgliedsnamen als Argumente an.

Beispielsweise:

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

Sie können auch Dateien extrahieren, die einem bestimmten Muster (Platzhalter) entsprechen. Um beispielsweise alle Dateien, die mit pic beginnen, aus cbz.tar zu extrahieren, können Sie Folgendes eingeben, unabhängig von ihrem Verzeichnispräfix:

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

Geben Sie Folgendes ein, um alle PHP-Dateien zu extrahieren:

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

Wo,

-x: weist tar an, Dateien zu extrahieren.
-f: Gibt den Dateinamen / Tarballnamen an.
-v: Ausführlich (Fortschritt beim Extrahieren von Dateien anzeigen).
-j: Archiv über bzip2 filtern, zum Dekomprimieren von .bz2-Dateien verwenden.
-z: Archiv über gzip filtern, zum Dekomprimieren von .gz-Dateien verwenden.
--wildcards: weist tar an, Befehlszeilenargumente als Globbing-Muster zu behandeln.
--no-anchored: weist darauf hin, dass die Muster für Mitgliedsnamen nach einem / -Trennzeichen gelten.

Eugene S
quelle
3
Ich möchte keine bestimmten Dateien extrahieren. Ich möchte nur die ersten 50 Dateien extrahieren, da ich die Namen der Dateien nicht kenne.
Pieter van Niekerk
4
Sie können eine Liste der Dateinamen mit "tar -tf" abrufen, die ersten 50 mit "head" abrufen und diese Liste in einen anderen tar-Befehl als Liste der zu extrahierenden Dateinamen einfügen. Wie folgt: "tar -xf file.tar - kein verankerter` tar -tf file.tar | head -50` "
Simon Hibbs
Es ist durchaus möglich (in meinen Tests), eine teilweise versetzte 50. Datei zu extrahieren. Es wäre eine gute Idee, das Extrahieren der (aktuellen) letzten Datei in der -tListe zu vermeiden, bis der Tarball vollständig heruntergeladen ist. Zu jedem Zeitpunkt werden in der Liste nur Dateinamen angezeigt, die übertragen wurden oder werden, d. H. nicht die vollständige Liste; bis es vollständig heruntergeladen ist.
Peter.O
2

Ich habe das nicht selbst ausprobiert, aber wie wäre es damit:

tar xvf archive.tar | head -n50

Tar gibt für jede extrahierte Datei eine Zeile an STDOUT aus, dann beendet der headBefehl die Pipe nach 50 Zeilen. Wenn die Pfeife stirbt, würde ich erwarten, dass auch der Teer stirbt.

jippie
quelle
Sorry, das sollte natürlich eine sein head. Lass mich meine Antwort ändern.
jippie
Ich habe es nicht überprüft, befürchte jedoch, dass aufgrund des Pipe-Puffers tarmöglicherweise mehr als 50 Dateien vor SIGPIPEd extrahiert werden und insbesondere die letzte, unvollständige Datei.
Gilles 'SO- hör auf böse zu sein'
2
tar -tvf tarfile.tar

gibt Ihnen die gesamte Liste der Dateien in tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Dieser Befehl stellt das wieder her fileToRestore

Um mehrere, aber nicht alle Dateien zu entpacken, haben Sie folgende Möglichkeiten:

  • Sie setzen alle Dateilisten von tarfile.tarintar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Jetzt tar.txthat die ganze Liste der Dateien in tarfile.tar und Sie können nur die Dateien lassen, die Sie wiederherstellen möchten oder mit Kopf ...

    head -n50 tar.txt > tar2.txt
    

Sie können diese Zeilen in eine Datei einfügen

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

Oder die komplette Skriptdatei:

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

Und das ist alles

user84196
quelle
2
Das muss schmerzhaft langsam sein, um den Befehl tar in einer Schleife aufzurufen. Es liest jedes Mal die ganze Datei, oder?
Swdev