通过使用 -P 标志创建的 tar 文件将文件提取到相对路径

通过使用 -P 标志创建的 tar 文件将文件提取到相对路径

我正在使用标志创建一个 tar 文件-P,这意味着所有路径都是绝对路径(/文件名的前导不会被删除)。我使用它是因为我要打包多个目录,并且我需要将每个文件提取到其正确的位置。

我正在使用脚本来提取 tar 文件,并且如果提供了可选参数,我需要将文件提取到另一个目录的能力。

我创建这样的 tar 文件:

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

${DIR_A}/path/a并且 ${DIR_B}/path/b

如果我执行不带参数的提取脚本,我希望文件转到正确的目录。此部分按预期工作tar mxfvjpP

但是当脚本在参数中接收到路径时,我想将文件提取到/path/from/argument/path/a/path/from/argument/path/b

这有可能吗?这是我目前所拥有的:

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

这不起作用。 中的路径${EXTRACT_TO}已创建,但文件仍然被提取到/path/a/path/b

笔记:我无法修改 tar 文件。

答案1

在我的 Debian 提取中没有 -P产量。也许您所需要的只是在提取到另一个目录时Removing leading '/' from member names不要使用。-P


如果上述方法存在任何问题,请考虑--transform。来自man 1 tar

--transform=EXPRESSION,--xform=EXPRESSION
使用sedreplaceEXPRESSION变换文件名。

所以这

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

将从每个路径中删除一个前导斜杠(如果有)。但是因为////foo相当于/foo,下面的似乎更好:

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

它将删除所有前导斜杠。

相关内容