我正在使用該標誌創建一個 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|^/*||' …
它將刪除所有前導斜線。