解凍せずにzipファイルの権限を変更する

解凍せずにzipファイルの権限を変更する

ファイルを解凍せずにzip内のファイルの権限を変更する方法はありますか?明確にするには、ファイルの内容を変更するのではなく、ファイルに設定されているUnix権限を変更することです。ファイルを抽出して更新する以外は答えが見つかりませんでした。

ベストアンサー1

はい、時々。詳細をあまり深く扱うことなく、Zipファイルには各ファイルの項目のリストがあり、最後にそれを要約する別の項目があります。これらの項目は、ツール(およびそのバージョン)、ファイルシステム、Zip形式などによってファイル権限がある場合とない場合がありますが、ファイル権限がある場合は変更できます。

次のステップはDebian 10でテストされました。

zipファイルを作成しましょう。

$ echo "This is file 1" > file1.txt
$ chmod 777 file1.txt
$ echo "This is file 2" > file2.txt
$ chmod 555 file2.txt
$ zip files file?.txt

次に、ファイルと権限を一覧表示します。

$ zipinfo files.zip

Archive:  files.zip
Zip file size: 344 bytes, number of entries: 2
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:35 file1.txt
-r-xr-xr-x  3.0 unx       15 tx stor 20-Jun-08 18:30 file2.txt
2 files, 30 bytes uncompressed, 30 bytes compressed:  0.0%

これでアイテムを手動で繰り返すことができますが、すでにこれを実行して結果を印刷するプログラムがあります。

$ zipdetail files.zip

これは多くの情報を出力します。左側にはオフセットがあり、その横には各フィールドの名前と内容があります。

私たちはただ各ファイルが欲しいExt File Attributes

$ zipdetails files.zip | egrep "Ext File Attributes|Filename"

001A Filename Length       0009
001E Filename              'file1.txt'
006C Filename Length       0009
0070 Filename              'file2.txt'
00C0 Filename Length       0009
00CA Ext File Attributes   81FF0000
00D2 Filename              'file1.txt'
010F Filename Length       0009
0119 Ext File Attributes   816D0001
0121 Filename              'file2.txt'

それでは、(オフセット(10進数281、ファイル属性)のファイル属性)を書き、バイト順序をfile2.txt考慮して権限を変更しましょう。7770x81FF0000file1.txt0x0119file2.txt

$ printf "\x00\x00\xff\x81" | dd of=files.zip bs=1 seek=281 count=4 conv=notrunc

内容を再リストしてください。

$ zipinfo files.zip
Archive:  files.zip
Zip file size: 344 bytes, number of entries: 2
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:35 file1.txt
-rwxrwxrwx  3.0 unx       15 tx stor 20-Jun-08 18:30 file2.txt
2 files, 30 bytes uncompressed, 30 bytes compressed:  0.0%

これで、両方のファイルが同じ権限を共有します。

独自の権限を設定したい場合は、Zipの既存のファイルからコピーまたは確認できます。ここ

おすすめ記事