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.tar
intar.txt
tar -tvf tarfile.tar > tar.txt
Jetzt
tar.txt
ist die gesamte Dateiliste vorhandentarfile.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 head
beendet der Befehl die Pipe nach 50 Zeilen. Wenn die Pipe beendet wird, erwarte ich, dass auch Tar beendet wird.