從使用 -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|^/*||' …

它將刪除所有前導斜線。

相關內容