我正在使用标志创建一个 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
使用sed
replaceEXPRESSION
变换文件名。
所以这
tar -x --transform='s|^/||' …
将从每个路径中删除一个前导斜杠(如果有)。但是因为////foo
相当于/foo
,下面的似乎更好:
tar -x --transform='s|^/*||' …
它将删除所有前导斜杠。