У каждого файла есть владелец и группа. Если Test1 создает файл, принадлежащий группе 100, Test2 может получить к нему доступ. Таким образом, ни один из вариантов неверен - доступ к файлам зависит от прав доступа к файлам, а не от групп их создателей.
ls -s
сообщает член st_blocks
структуры, возвращаемый системными вызовами stat()
/lstat()
. Это число 512 -байтовых блоков. 512 байт обычно являются минимальной степенью детализации хранилища, поскольку это соответствует ранним секторам диска.
По крайней мере, это то, что делает большинство ls
реализаций, включая исходную реализацию Unix, и то, что требует POSIX.
Реализация GNUls
(также busybox
, которая имитирует ее, обе найдены в Ubuntu ), однако изменена на 1024 -байтовых блока, но возвращается к 512 -байтовым блокам, если$POSIXLY_CORRECT
(ранее$POSIX_ME_HARDER
)переменная находится в среде (не для busybox ). Я предполагаю, что это делается для того, чтобы сделать его более читаемым для человека, но это означает, что мы теряем точность в файловых системах, которые используют гранулярность хранения 512 -байт, и не помогают с переносимостью.
Из журнала изменений:
Wed Aug 21 13:03:14 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
Version 3.0.
du.c, ls.c: Make 1K blocks the default size, and -k a no-op. Down with dumb standards!
В GNUls
(not busybox )размер блока также можно указать с помощью опции --block-size
или переменной окружения $LS_BLOCK_SIZE
. Таким образом, вы можете использовать ls --block-size=1 -s
или LS_BLOCK_SIZE=1 ls -s
, чтобы получить использование диска в байтах. В других реализациях ls
, таких как BSD, используется $BLOCKSIZE
для этого¹ (, также распознаваемый GNU, а также $BLOCK_SIZE
ls
как , показанный @yahol).
В соответствии с POSIX вы можете использовать -k
для получения значения в кибибайтах (, которое, к счастью, в GNU или BSD ls
имеет приоритет над $BLOCKSIZE
переменными окружения ).
Переносимо (, если вы хотите принять во внимание busybox ls
, где отчет в кибибайтах жестко запрограммирован ),чтобы вернуться кst_blocks
(или хотя бы приблизительному ), вам понадобится что-то вроде:
blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')
В GNU find
, -printf %b
сообщает количество блоков по 512 -байтов, а -printf %k
блоков по 1024 -байт, и на него не влияет среда. -printf
относится к GNU.
В любом случае, в настоящее время это никак не связано с размером блока файловой системы.
¹ В BSD $BLOCKSIZE
округляется до кратного 512(BLOCKSIZE=1023
равноBLOCKSIZE=512
)и значения ниже 512 не допускаются
Это объясняется в info coreutils Block size
(, к которому я пришел из info ls
):
2.3 Block size
(...)The block size used for display is independent of
any file system block size.(...)
‘DF_BLOCK_SIZE’
This specifies the default block size for the ‘df’ command.
Similarly, ‘DU_BLOCK_SIZE’ specifies the default for ‘du’ and
‘LS_BLOCK_SIZE’ for ‘ls’.
Кажется, что каждая из этих программ может использовать различный размер блока, определенный в переменных окружения.
Следующие две env
переменные могут помочь унифицировать выходные данные:
‘BLOCK_SIZE’
This specifies the default block size for all three commands, if
the above command-specific environment variables are not set.
‘BLOCKSIZE’
This specifies the default block size for all values that are
normally printed as blocks, if neither ‘BLOCK_SIZE’ nor the above
command-specific environment variables are set. Unlike the other
environment variables, ‘BLOCKSIZE’ does not affect values that are
normally printed as byte counts, e.g., the file sizes contained in
‘ls -l’ output.
И это объясняет, почему по умолчанию все это равно 512 блокам:
‘POSIXLY_CORRECT’
If neither ‘COMMAND_BLOCK_SIZE’, nor ‘BLOCK_SIZE’, nor ‘BLOCKSIZE’
is set, but this variable is set, the block size defaults to 512.