bsdtar
libarchive
パッケージ(少なくともArch Linuxでは)のコマンドがを.zip
読み取るときに-archivesにあるファイルの実行可能ビットを削除しますstdin
が、ファイルを直接処理するときは削除しないことを見たことがあります。
-archives では、.tar
標準入力から読み取る際に実行可能なビットも保存します。
テストケース:
アーカイブの作成:
ファイルを生成します。
touch a.txt
chmod 644 a.txt
touch a.out
chmod 755 a.out
ファイル権限:
ls -ln a.out a.txt
プログラム
-rwxr-xr-x 1 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 1 1001 1001 0 Dec 12 11:01 a.txt
ファイルをアーカイブに圧縮します。
bsdtar --format=zip -cf a.zip a.out a.txt
bsdtar -cf a.tar a.out a.txt
zip
(tar
CREATEアーカイブの代わりにANDを使用すると、bsdtar
同じ結果が生成されます。)
アーカイブコンテンツを直接抽出/表示:
bsdtar -tvf a.zip
または
bsdtar -tvf - < a.zip
プログラム
-rwxr-xr-x 0 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 0 1001 1001 0 Dec 12 11:01 a.txt
ここに表示される実行可能ビットですa.out
。権限はa.out
755とa.txt
644です。
読むstdin
:
cat a.zip | bsdtar -tvf -
プログラム
-rw-rw-r-- 0 1001 1001 0 Dec 12 11:01 a.out
-rw-rw-r-- 0 1001 1001 0 Dec 12 11:01 a.txt
ここで実行可能なビットはa.out
削除されます。また、両方のファイルはグループ書き込みが可能ですが、そのようにパッケージ化されません。a.out
との権限はa.txt
すべて664です。
.tar
-ファイル:
これに対して.tar
-archive の場合、パイプから読み取る際にアーカイブの権限も尊重されますstdin
。
bsdtar --numeric-owner -tvf a.tar
そして
cat a.tar | bsdtar --numeric-owner -tvf -
みんな見える
-rwxr-xr-x 0 1001 1001 0 Dec 12 11:01 a.out
-rw-r--r-- 0 1001 1001 0 Dec 12 11:01 a.txt
(ZIPアーカイブの内容を表示すると、デフォルトでは数値bsdtar
所有者が表示されます。TARアーカイブの場合は所有者名が表示されます。)
問題は次のとおりです。
何がstdin
そんなに特別ですかbsdtar
?なぜファッションではなくパイプで読むときにのみ読むことができますかbsdtar -tvf - < a.zip
?.zip
-archiveが特別で、-archiveではないのはなぜですか.tar
?
ベストアンサー1
Zipアーカイブには、コンテンツを記述する2つの方法が含まれています。
- 各項目のヘッダー
- zipファイルの末尾にある中央ディレクトリ。
libarchive(および拡張bsdtar)は、入力から検索できる場合は中央ディレクトリを使用し、それ以外の場合はストリーム専用ロジックに置き換えられます。テストケースで見たように、これらの項目は必ずしも一貫しているわけではありません。これについて私たちができることやしたいことはあまりありません。 wgetを通常の猫に置き換えても、同じ動作が表示されます。
簡単に言えば、これはzipファイルストリームの本質的な問題であり、これを解決する方法はありません。
そしてこのコメント次のコマンドを使用して一貫したZIPファイルを作成する方法を説明しますbsdtar
。
bsdtar
生成情報の一貫性を維持するには、zipファイル生成コマンドに以下を追加する必要が--options zip:experimental
あります。bsdtar
bsdtar --format=zip --options zip:experimental -cf a.zip a.out a.txt
それから
cat a.zip | bsdtar -tvf -
正しい権限を表示:
-rwxr-xr-x 0 1001 1001 0 Feb 17 21:18 a.out
-rw-r--r-- 0 1001 1001 0 Feb 17 21:18 a.txt