これは少しエキゾチックな質問ですが、これに関する情報はネット上にあまりないようです。zip形式の外部ファイル属性に関する質問への回答を追加しました。私の答えからわかるように、Unixでは実際には2バイト(4バイト)しか使用されていないと結論付けています。どうやらこれは、オブジェクトがファイルであるかディレクトリであるかを推測するために解凍するときに十分な情報を含み、他の許可と属性情報のためのスペースも持っています。私の質問は、これが通常のUnixパーミッションにどのようにマッピングされるのかということです。ls
正確に1バイトに収まる通常のUnixアクセス許可(たとえば、以下)を実行します。そうであれば、誰かがレイアウトを説明したり、参照を提供したりできますか?
$ ls -la
total 36
drwxr-xr-x 3 faheem faheem 4096 Jun 10 01:11 .
drwxrwxrwt 136 root root 28672 Jun 10 01:07 ..
-rw-r--r-- 1 faheem faheem 0 Jun 10 01:07 a
drwxr-xr-x 2 faheem faheem 4096 Jun 10 01:07 b
lrwxrwxrwx 1 faheem faheem 1 Jun 10 01:11 c -> b
具体的な質問をして、これをより具体的にしましょう。上記の私の回答で引用したTracパッチに従って、以下のPythonのスニペットでzipファイルを作成できます。
040755 << 16L
値は、権限を持つ空のディレクトリの作成に対応しますdrwxr-xr-x
。(テストしました)。私0755
はrwxr-xr-x
パターンに対応していることを認識していますが、については04
どうですか、また値全体はどのようにバイトに対応していますか?また<< 16L
、16桁のビット単位の左シフトに対応することも認識しています。これにより、最上位バイトから2番目にシフトします。
def makezip1():
import zipfile
z = zipfile.ZipFile("foo.zip", mode = 'w')
zfi = zipfile.ZipInfo("foo/empty/")
zfi.external_attr = 040755 << 16L # permissions drwxr-xr-x
z.writestr(zfi, "")
print z.namelist()
z.close()
編集:これを読み直すと、Unixのアクセス許可は1バイトにしか対応していないという私の結論は間違っているかもしれませんが、正しい答えがわからないので、上記を現在のままにしておきます。
EDIT2:1バイトのみに対応するUnix値については、実際に間違っていました。@ Random832が説明したように、上位2バイトの両方を使用します。@ Random832の答えによれば040755
、彼が下に示す表から目的の値を作成できます。すなわち:
__S_IFDIR + S_IRUSR + S_IWUSR + S_IXUSR + S_IRGRP + S_IXGRP + S_IROTH + S_IXOTH
0040000 + 0400 + 0200 + 0100 + 0040 + 0010 + 0004 + 0001
= 40755
ここの追加はベース8にあります。