Ich erstelle eine Tar-Datei mit dem -P
Flag, 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/a
und ${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/a
extrahieren /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/a
und extrahiert /path/b
.
NOTIZ: Ich kann die TAR-Datei nicht ändern.
Antwort1
In meinem Debian-Extraktionohne -P
ergibt Removing leading '/' from member names
. Vielleicht müssen Sie es nur nicht verwenden, -P
wä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 Siesed
„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////foo
ist äquivalent zu/foo
, das Folgende scheint besser:
tar -x --transform='s|^/*||' …
Es werden alle führenden Schrägstriche entfernt.