-P フラグで作成した tar ファイルから相対パスにファイルを抽出します。

-P フラグで作成した tar ファイルから相対パスにファイルを抽出します。

私はフラグを使用して tar ファイルを作成しています-P。これは、すべてのパスが絶対パスであることを意味します (/ファイル名の先頭は削除されません)。複数のディレクトリを tar し、各ファイルを正しい場所に抽出する必要があるため、これを使用します。

スクリプトを使用して 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ファイル名を変換するには、replace を--xform=EXPRESSION
使用します。sedEXPRESSION

したがって、この

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

パスの先頭のスラッシュを1つ(ある場合)削除します。しかし、////fooは以下と同等である/foo、次の方が良いようです:

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

先頭のスラッシュをすべて削除します。

関連情報