私はフラグを使用して 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
使用します。sed
EXPRESSION
したがって、この
tar -x --transform='s|^/||' …
パスの先頭のスラッシュを1つ(ある場合)削除します。しかし、////foo
は以下と同等である/foo
、次の方が良いようです:
tar -x --transform='s|^/*||' …
先頭のスラッシュをすべて削除します。