bitlvl
RU

Расшифровка ls -l и stat

Вставьте одну или несколько строк из ls -l либо вывод stat file. Каждый столбец будет назван и расшифрован, включая маркеры, на которые большинство не обращает внимания.

Результаты и сообщения этого инструмента выводятся на английском языке.

Как читать ls -l

-rwxr-xr-x. 1 root root 4096 Oct 18 12:00 script.sh
│└┬┘└┬┘└┬┘│ │  │    │    │    └────┬────┘ └───┬───┘
│ │  │  │ │ │  │    │    │         │          └ имя (и -> цель для символических ссылок)
│ │  │  │ │ │  │    │    │         └ время изменения (год показан, если старше 6 месяцев)
│ │  │  │ │ │  │    │    └ размер в байтах (или major, minor для устройств)
│ │  │  │ │ │  │    └ группа
│ │  │  │ │ │  └ владелец
│ │  │  │ │ └ число жёстких ссылок
│ │  │  │ └ . = контекст SELinux, + = ACL, @ = расширенные атрибуты (macOS)
│ │  │  └ остальные: r-x
│ │  └ группа: r-x
│ └ владелец: rwx
└ тип: - файл, d каталог, l символическая ссылка, c символьное устройство, b блочное устройство, p канал, s сокет

Что обычно сбивает с толку

  • Число ссылок: сколько записей каталогов указывают на inode. Для каталога это 2 плюс число подкаталогов, потому что .. каждого подкаталога тоже считается. У файла с числом 3 есть ещё две жёсткие ссылки где-то в системе.
  • Размер каталога: размер его списка записей (4096 на ext4), а не суммарный размер содержимого. Для этого используйте du -sh.
  • s, S, t, T в строке прав — это биты setuid, setgid и sticky; строчная буква означает, что лежащий под ней бит выполнения тоже установлен, заглавная — что нет (обычно ошибка).
  • Права символических ссылок всегда lrwxrwxrwx и игнорируются; важны права цели.
  • Время: ls показывает mtime (изменение содержимого). stat также показывает atime (последнее чтение, часто отключено через noatime), ctime (изменение inode: chmod, chown, rename) и время создания на файловых системах, которые его хранят.

stat

stat file выводит всё, что хранит inode: режим в восьмеричной и символьной форме, uid/gid с именами, номер inode, устройство, число блоков (в единицах по 512 байт, поэтому разрежённый файл показывает меньше блоков, чем требовал бы его размер) и четыре метки времени. stat -c '%a %U %G %n' * выводит только то, что вы запросили; stat -f описывает файловую систему.

Вопросы

Что означает точка в конце прав доступа?

На файле установлен контекст безопасности SELinux (встречается на Fedora, RHEL, CentOS). ls -Z показывает его. Знак + вместо точки означает, что есть список контроля доступа (ACL); getfacl показывает его.

Почему у каталога число ссылок 2?

Его собственная запись в родительском каталоге плюс его запись «.». Каждый подкаталог добавляет ещё одну через свой «..». Так что у каталога с числом ссылок 7 пять подкаталогов.

В чём разница между mtime и ctime?

mtime меняется при изменении содержимого; ctime — при изменении inode (содержимое, права, владелец, число ссылок). ctime нельзя задать через touch, что делает его полезным для форензики.

Как увидеть скрытые файлы и размеры в удобных единицах?

ls -lah: -a показывает dotfiles, -h выводит размеры как K, M, G. Добавьте -t для сортировки по времени и -r для обратного порядка.