Битлента
Сетевые команды и утилиты6 мин чтения·

Команда stat: размер, владелец, права и время файла

Что показывает stat в Linux и macOS: размер, права, владелец, inode и три времени файла. Отличия ключей GNU и BSD, примеры форматов -c и -f.

Кратко

stat имя выводит сведения о файле: размер, права, владельца, inode и времена доступа, изменения и смены атрибутов. Ключи различаются: в Linux формат задаёт -c, в macOS — -f, а в Linux -f показывает файловую систему, а не файл.

Что выводит stat без ключей

Команда ls -l отвечает на базовые вопросы: размер, владелец, права, дата. Когда нужно больше, подключают stat. Она читает служебную запись файла и выводит её практически целиком. Запустите на тестовом файле: echo test > ~/stat-demo.txt и stat ~/stat-demo.txt.

В Linux с GNU-версией вывод построен блоками с подписями. Обычно в нём есть имя файла, размер в байтах, число блоков, тип, номер устройства и номер inode, счётчик ссылок, права в числовом и символьном виде, владелец и группа, а также метки времени: три основные, а в новых версиях GNU stat ещё и четвёртая, Birth. В macOS без ключей stat печатает всё в одну длинную строку из чисел, которую читать неудобно, поэтому для чтения людьми там пригодится ключ -x, он выводит блоки подписей, похожие на Linux.

Точный набор полей зависит от версии и системы, поэтому сверяйтесь с man stat. Для задач диагностики чаще всего хватает нескольких полей, и ниже они разобраны по порядку. Команда ничего не меняет: она только читает сведения, поэтому запускать её можно на любых файлах, к которым у вас есть доступ на просмотр.

Три времени: mtime, atime, ctime

Самое поучительное в выводе stat — три метки времени, которые часто путают. Они обозначаются сокращениями из справки POSIX и отвечают на разные вопросы.

МеткаКогда обновляетсяЧто показывает ls
Modify (mtime)при изменении содержимого файлаls -l без ключей
Access (atime)при чтении файла, с оговоркамиls -lu
Change (ctime)при изменении метаданных: прав, владельца, числа ссылок, при переименованииls -lc

Важная ловушка: ctime — это не время создания. Оно меняется, когда вы выполняете chmod, chown или переименовываете файл (а также при изменении содержимого), а значит, отражает последнюю правку файла или его метаданных. Время создания, если файловая система его хранит, в Linux выводится строкой Birth в новых версиях GNU stat, а в macOS присутствует в выводе в виде отдельного времени рождения.

Что касается atime: во многих системах обновление времени доступа ослаблено настройками монтирования, чтобы не нагружать диск записью при каждом чтении. Поэтому значение atime не стоит принимать за точный журнал открытий. Для сравнения и поиска по возрасту файла в find используется время изменения, как описано в статье про find.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно

Свой формат вывода: -c в Linux и -f в macOS

Для скриптов и быстрых проверок удобно вывести только нужные поля. Здесь Linux и macOS расходятся, и это главное, что стоит запомнить. В GNU stat формат задаётся ключом -c (--format) со спецификаторами через процент. В BSD stat на macOS тот же смысл у ключа -f, а спецификаторы другие.

ЗадачаLinux (GNU)macOS (BSD)
Размер в байтах и имяstat -c '%s %n' файлstat -f '%z %N' файл
Права числом и имяstat -c '%a %n' файлstat -f '%Lp %N' файл
Владелец и имяstat -c '%U %n' файлstat -f '%Su %N' файл
Время измененияstat -c '%y' файлstat -f '%Sm' файл

Если вы примете рецепт из одной системы на другой, получите либо ошибку, либо неожиданный вывод. Особенно коварен случай с -f в Linux: там он означает «показать состояние файловой системы», а не файла, и вместо ожидаемого вы увидите сведения о разделе, на котором лежит файл.

Полный список спецификаторов лежит в man stat, и лучше обращаться к нему, чем выписывать из памяти. Строку формата берут в одинарные кавычки, чтобы оболочка не трактовала знак процента и пробелы по-своему.

Когда stat помогает при диагностике

Вот ситуации, где одной команды ls мало, а stat даёт ответ сразу.

  • Файл «не открывается». Посмотрите права и владельца: возможно, он принадлежит другому пользователю или был создан от имени администратора.
  • Не ясно, менялся ли файл. Сравните mtime и ctime: если ctime заметно свежее mtime, то после последней правки содержимого менялись метаданные (права, владелец, число ссылок или имя).
  • Два имени с одним содержимым. Совпадение inode и счётчик ссылок больше единицы говорят о жёсткой ссылке, подробнее в статье про ln.
  • Размер в ls и в Finder не сходится. stat показывает размер в байтах и число занятых блоков, и по их соотношению видно разреженные файлы и округление до блока.

Для каталога stat тоже работает: у каталога mtime меняется, когда в нём добавляется или удаляется запись, а не когда правится файл внутри. Это объясняет, почему время каталога иногда не совпадает с ожидаемым.

Если нужно сравнить два файла между собой, а не изучать метаданные одного, применяют diff, о нём есть отдельная страница. Обе команды дополняют друг друга: stat описывает «где и кто», diff показывает, чем различается содержимое.

Ограничения и частые вопросы по выводу

Несколько замечаний, чтобы не делать поспешных выводов из цифр.

Для символической ссылки stat по умолчанию в Linux сообщает о самой ссылке или о цели в зависимости от ключей: ключ -L заставляет следовать по ссылке и описывать цель. В macOS поведение при вызове без ключей сходно, но для точного ответа сверяйтесь со справкой установленной версии.

Время отображается в часовом поясе вашей системы. Если вы сравниваете значения с сервера в другом поясе, учитывайте смещение, которое GNU stat выводит рядом со временем.

Некоторые файловые системы, например на внешних накопителях, хранят времена с меньшей точностью. Поэтому после копирования на такой носитель время изменения может округлиться, что иногда объясняет, почему rsync считает файлы отличающимися. Подробнее о сравнении деревьев в статье про пробный запуск rsync.

Наконец, stat только читает данные: поменять времена можно командой touch, а права и владельца — chmod и chown. Эти команды разобраны на отдельных страницах, ссылки на них есть среди связанных.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно
statlinuxmacosметаданныефайлы

Часто задаваемые вопросы

Читайте также