tar.gz全体からファイルを抽出しようとしても機能しません。問題のシミュレーションに使用するコマンドは次のとおりです。
mkdir test
touch test/version.txt
echo "1.0.2" > test/version.txt
tar zcvf rootfs.tar -C test .
gzip -f -9 -n -c rootfs.tar > rootfs.tar.gz
tar xf rootfs.tar.gz version.txt
tar: version.txt: Not found in archive
tar: Exiting with failure status due to previous errors
理由を教えてもらえますか?上記のtar.gzにversion.txtファイルがあります。
答え1
rootfs.tar
gzipで圧縮されたtarアーカイブ。rootfs.tar.gz
gzipで2回圧縮されたtarアーカイブ。 Tarは二重圧縮のために混乱し、エラーを報告せずにファイルを空のアーカイブとして扱います。
2回圧縮することは意味がありませんので、この追加のgzipステップを削除してください。混乱を避けるために渡すパスが 。で始まるので、解凍rootfs.tar.gz
時に . で始まるパスを渡す必要があります。 tarはパスの操作を無作為に処理しません。rootfs.tar
tar
.
./
./
mkdir test
touch test/version.txt
echo "1.0.2" > test/version.txt
tar zcvf rootfs.tar.gz -C test .
tar xf rootfs.tar.gz ./version.txt
./
ファイル名に接頭辞を付けないようにするには、--transform
アーカイブを作成するときにそれを使用できます。
tar zcvf rootfs.tar.gz --transform='s!^\./!!' -C test .
tar xf rootfs.tar.gz version.txt