Extrahieren Sie Dateien in einen relativen Pfad aus einer Tar-Datei, die mit dem Flag -P erstellt wurde

Extrahieren Sie Dateien in einen relativen Pfad aus einer Tar-Datei, die mit dem Flag -P erstellt wurde

Ich erstelle eine Tar-Datei mit dem -PFlag, was bedeutet, dass alle Pfade absolut sind (führende Zeichen /werden nicht aus den Dateinamen entfernt). Ich verwende es, weil ich mehrere Verzeichnisse tarne und jede Datei an den richtigen Speicherort extrahieren muss.

Ich verwende ein Skript zum Extrahieren der TAR-Datei und brauche die Möglichkeit, die Dateien in ein anderes Verzeichnis zu extrahieren, wenn ein optionales Argument angegeben wird.

Die Tar-Datei erstelle ich folgendermaßen:

tar pcjfPv "${ARCHIVE_NAME}".tmp.bz  ${DIR_A} ${DIR_B}

${DIR_A}ist /path/aund ${DIR_B}ist /path/b.

Wenn ich das Extraktionsskript ohne Argument ausführe, erwarte ich, dass die Dateien in die richtigen Verzeichnisse verschoben werden. Dieser Teil funktioniert wie erwartet mit tar mxfvjpP.

Wenn das Skript jedoch einen Pfad im Argument empfängt, möchte ich die Dateien dorthin /path/from/argument/path/aextrahieren /path/from/argument/path/b.

Ist das überhaupt möglich? Das hier habe ich derzeit:

if [ ! -d "${EXTRACT_TO}" ]; then
    echo "${EXTRACT_TO} does not exist, creating."
    mkdir -p ${EXTRACT_TO}
fi
tar mxfvjP - -C ${EXTRACT_TO}

Das funktioniert nicht. Der Pfad in ${EXTRACT_TO}wird erstellt, aber die Dateien werden trotzdem nach /path/aund extrahiert /path/b.

NOTIZ: Ich kann die TAR-Datei nicht ändern.

Antwort1

In meinem Debian-Extraktionohne -Pergibt Removing leading '/' from member names. Vielleicht müssen Sie es nur nicht verwenden, -Pwährend Sie es in ein anderes Verzeichnis extrahieren.


Wenn mit dem obigen Ansatz ein Problem besteht, ziehen Sie Folgendes in Betracht --transform. Von man 1 tar:

--transform=EXPRESSION, --xform=EXPRESSION
Verwenden Sie sed„Ersetzen“ EXPRESSION, um Dateinamen zu transformieren.

Also das

tar -x --transform='s|^/||' …

entfernt einen führenden Schrägstrich (falls vorhanden) aus jedem Pfad. Aber weil////fooist äquivalent zu/foo, das Folgende scheint besser:

tar -x --transform='s|^/*||' …

Es werden alle führenden Schrägstriche entfernt.

verwandte Informationen