Це злегка екзотичне питання, але в мережі, як здається, не так багато інформації. Я щойно додав відповідь на запитання про зовнішній атрибут файлу формату zip . Як видно з моєї відповіді, я роблю висновок, що для Unix насправді використовується лише другий байт (4 байти). Мабуть, це містить достатньо інформації при розпакуванні, щоб визначити, чи є об'єктом файл чи каталог, а також є місце для іншої інформації про дозвіл та атрибути. Моє запитання полягає в тому, як це відображається до звичайних дозволів Unix? Чи ls
підходять звичайні дозволи 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 внизу.
040755 << 16L
Значення відповідає створенню порожнього каталогу з дозволами drwxr-xr-x
. (Я тестував). Я розпізнаю, що 0755
відповідає rwxr-xr-x
шаблону, але як щодо 04
, і як ціле значення відповідає байту? Я також визнаю, що << 16L
відповідає зсув лівого зсуву на 16 місць, який би перетворив його на другий верхній байт.
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()
EDIT: Перечитуючи це, я вважаю, що мій висновок про те, що дозволи Unix відповідають лише одному байту, може бути невірним, але я дозволю вищевикладеному сказати, оскільки я не впевнений, що правильна відповідь.
EDIT2: Я дійсно помилявся щодо значень Unix, що відповідають лише 1 байту. Як пояснив @ Random832, він використовує обидва з двох кращих байтів. Відповідаючи на відповідь @ 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 .