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

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

Ich habe ein großes Tarball, das gerade per FTP von einem Remote-System auf unser lokales System übertragen wird.

Ich möchte wissen, ob es möglich ist, mit dem Entpacken von beispielsweise 50 Dateien gleichzeitig zu beginnen, sodass mit der Verarbeitung dieser Dateien begonnen werden kann, während die Übertragung stattfindet.

Antwort1

Hierist eine ausführliche Erklärung, wie man bestimmte Dateien aus einem Archiv extrahieren kann. Insbesondere kann GNU tar 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.

Zum Beispiel:

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

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

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

Um alle PHP-Dateien zu extrahieren, geben Sie Folgendes ein:

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

Wo,

-x: weist Tar an, Dateien zu extrahieren.
-f: gibt den Dateinamen/Tarball-Namen an.
-v: Ausführlich (zeigt den Fortschritt beim Extrahieren von Dateien an).
-j: filtert Archive über bzip2, verwendet zum Dekomprimieren von .bz2-Dateien.
-z: filtert Archive über gzip, verwendet zum Dekomprimieren von .gz-Dateien.
--wildcards: weist Tar an, Befehlszeilenargumente als Globbing-Muster zu behandeln.
--no-anchored: informiert es darüber, dass die Muster auf Mitgliedsnamen nach jedem /-Trennzeichen angewendet werden.

Antwort2

tar -tvf tarfile.tar

gibt Ihnen die gesamte Liste der Dateien intarfile.tar

tar -xvf tarfile.tar fileToRestore  

Dieser Befehl stellt diefileToRestore

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

  • Sie legen die gesamte Dateiliste tarfile.tarintar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Jetzt tar.txtist die gesamte Dateiliste vorhanden tarfile.tar und Sie können nur die Dateien belassen, die Sie wiederherstellen möchten, oder mit dem 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

Antwort3

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 headbeendet der Befehl die Pipe nach 50 Zeilen. Wenn die Pipe beendet wird, erwarte ich, dass auch Tar beendet wird.

verwandte Informationen