
Ich habe eine .tar
Datei, die etwa 70 % meines Speicherplatzes einnimmt, und ich müsste sie auf dieselbe Festplatte entpacken. Verfügt der tar
Befehl über eine Option zum Entfernen der Dateien, die während des Vorgangs bereits entpackt wurden, damit sie den Speicherplatz nicht mehr beanspruchen? Die --delete
Option scheint bestimmte Dateien aus dem Archiv entfernen zu können .tar
, aber gibt es eine Möglichkeit, anzugeben, tar
dass immer die letzte Datei entfernt werden soll, die gerade entpackt wurde? Auf diese Weise .tar
würde die Größe der entpackten Dateien mit zunehmender Größe am Ende bis auf Null abnehmen.
Darüber hinaus könnte der Vorgang bei einer Unterbrechung dort fortgesetzt werden, wo er aufgehört hat, da in der Datei nur noch die entpackten Dateien vorhanden wären .tar
.
Antwort1
#! /bin/bash
test ! -e "$1" && echo "Run with a tar archive" && exit
tar --list -f "$1" | tac | while IFS= read -r fname; do
test "${fname: -1}" = '/' && continue # skip directories
tar --extract -f "$1" "$fname" || exit 1 # let's stop in case we can't extract a file
tar --delete -f "$1" "$fname" || exit 2 # just in case
done
test "$?" = "0" && tar xf "$1" # restore directories timestamps
tac
wird verwendet, um die Reihenfolge der Dateien umzukehren, sodass tar nach dem Löschen einer Datei nicht das gesamte Archiv neu schreiben muss – tar muss das Archiv nur kürzen. Ich habe das Skript an einigen Dateien getestet – es funktioniert gut, kann jedoch bei Archiven mit vielen kleinen Dateien extrem langsam sein.
"${fname: -1}"
extrahiert das letzte Symbol eines Dateinamens - wenn es ein Schrägstrich ist, handelt es sich um ein Verzeichnis, also überspringen wir es. In den Kommentaren finden Sie eine portable Version.