Поиск по сайту:

Как использовать команду stat в Linux


Команда Linux stat показывает гораздо больше деталей, чем ls. Загляните за кулисы с помощью этой информативной и настраиваемой утилиты. Мы покажем вам, как его использовать.

stat перенесет вас за кулисы

Команда ls хороша в том, что она делает, и делает она многое, но в Linux кажется, что всегда есть способ заглянуть глубже и увидеть, что лежит под поверхностью. И часто дело не только в поднятии края ковра. Вы можете разорвать половицы, а затем выкопать яму. Вы можете очистить Linux, как луковицу.

ls покажет вам много информации о файле, например, какие разрешения установлены для него, насколько он велик и является ли он файлом или символической ссылкой. Чтобы отобразить эту информацию , ls считывает ее из структуры файловой системы, которая называется индексным узлом.

У каждого файла и каталога есть индексный дескриптор. Индексный дескриптор содержит метаданные о файле, например, какие блоки файловой системы он занимает, и метки даты, связанные с файлом. Инод похож на библиотечную карточку для файла. Но ls покажет вам только часть информации. Чтобы увидеть все, нам нужно использовать команду stat.

Как и ls, команда stat имеет множество параметров. Это делает его отличным кандидатом на использование псевдонимов. Как только вы обнаружите определенный набор параметров, которые заставляют stat выдавать нужные вам выходные данные, оберните их псевдонимом или функцией оболочки. Это делает его гораздо более удобным в использовании, и вам не нужно запоминать загадочный набор параметров командной строки.

Быстрое сравнение

Давайте воспользуемся ls, чтобы получить длинный список (опция -l) с удобочитаемыми размерами файлов (опция -h):

ls -lh ana.h

Слева направо информация, которую предоставляет ls:

  • Самый первый символ — это дефис -, и это говорит нам о том, что файл является обычным файлом, а не сокетом, символической ссылкой или другим типом объекта.
  • Владелец, группа и другие разрешения перечислены в восьмеричном формате.
  • Количество жестких ссылок, указывающих на этот файл. В этом случае и в большинстве случаев это будет один.
  • Владелец файла — Дэйв.
  • Владелец группы — Дэйв.
  • Размер файла – 802 байта.
  • Последний раз файл был изменен в пятницу, 13 декабря 2015 г.
  • Имя файла: ana.c.

Давайте посмотрим на stat :

stat ana.h

Информация, которую мы получаем из stat:

  • Файл: имя файла. Обычно это то же имя, которое мы передали в stat в командной строке, но оно может отличаться, если мы смотрим на символическую ссылку.
  • Размер: размер файла в байтах.
  • Блоки: количество блоков файловой системы, которое требуется файлу для хранения на жестком диске.
  • Блок ввода-вывода: размер блока файловой системы.
  • Тип файла: тип объекта, описываемого метаданными. Наиболее распространенными типами являются файлы и каталоги, но они также могут быть ссылками, сокетами или именованными каналами.
  • Устройство: номер устройства в шестнадцатеричном и десятичном формате. Это идентификатор жесткого диска, на котором хранится файл.
  • Inode: номер inode. То есть ID-номер этого инода. Вместе номер индексного дескриптора и номер устройства однозначно идентифицируют файл.
  • Ссылки. Это число указывает, сколько жестких ссылок указывает на этот файл. Каждая жесткая ссылка имеет свой индексный дескриптор. Таким образом, другой способ думать об этой цифре — сколько инодов указывает на этот файл. Каждый раз, когда создается или удаляется жесткая ссылка, это число будет увеличиваться или уменьшаться. Когда он достигает нуля, сам файл был удален, а индекс удален. Если вы используете stat для каталога, это число представляет собой количество файлов в каталоге, включая «.» запись для текущего каталога и запись «..» для родительского каталога.
  • Доступ. Права доступа к файлам отображаются в восьмеричном и традиционном формате rwx (чтение, запись, выполнение).
  • Uid: идентификатор пользователя и имя учетной записи владельца.
  • Gid: идентификатор группы и имя учетной записи владельца.
  • Доступ: отметка времени доступа. Не так просто, как может показаться. Современные дистрибутивы Linux используют схему под названием relatime, которая пытается оптимизировать записи на жесткий диск, необходимые для обновления времени доступа. Проще говоря, время доступа обновляется, если оно старше времени изменения.
  • Изменить: отметка времени модификации. Это время последнего изменения содержимого файла. (Как назло, последний раз содержимое этого файла менялось четыре года назад.)
  • Изменить: отметка времени изменения. Это время последнего изменения атрибутов или содержимого файла. Если вы изменяете файл, устанавливая новые разрешения для файла, отметка времени изменения будет обновлена (поскольку атрибуты файла изменились), но измененная отметка времени не будет обновлена (поскольку файл content не были изменены).
  • Рождение: зарезервировано для отображения исходной даты создания файла, но это не реализовано в Linux.

Понимание временных меток

Отметки времени зависят от часового пояса. -0500 в конце каждой строки показывает, что этот файл был создан на компьютере в часовом поясе всемирного координированного времени (UTC), который на пять часов опережает часовой пояс текущего компьютера. Итак, этот компьютер на пять часов отстает от компьютера, создавшего этот файл. На самом деле файл был создан на компьютере с часовым поясом Великобритании, и мы рассматриваем его здесь на компьютере с часовым поясом Восточного стандарта США.

Временные метки модификации и изменения могут вызвать путаницу, потому что для непосвященных их имена звучат так, как будто они означают одно и то же.

Давайте используем chmod для изменения прав доступа к файлу с именем ana.c. Мы собираемся сделать его доступным для всех. Это не повлияет на содержимое файла, но повлияет на атрибуты файла.

chmod +w ana.c

А затем мы будем использовать stat для просмотра временных меток:

stat ana.c

Временная метка изменения была обновлена, а измененная — нет.

Временная метка modified будет обновлена только в случае изменения содержимого файла. Отметка времени change обновляется как для изменений содержимого, так и для изменений атрибутов.

Использование статистики с несколькими файлами

Чтобы иметь статистический отчет по нескольким файлам одновременно, передайте имена файлов в stat в командной строке:

stat ana.h ana.o

Чтобы использовать stat для набора файлов, используйте сопоставление с образцом. Знак вопроса «?» представляет любой отдельный символ, а звездочка «*» представляет любую строку символов. Мы можем указать stat, чтобы он сообщал о любом файле с именем «ana» с однобуквенным расширением, с помощью этой команды:

stat ana.?

Использование статистики для создания отчетов о файловых системах

stat может сообщать о состоянии файловых систем, а также о состоянии файлов. Параметр -f (файловая система) сообщает stat, что следует сообщать о файловой системе, в которой находится файл. Обратите внимание, что мы также можем передать каталог, например «/», в stat вместо имени файла.

stat -f ana.c

Информация, которую дает нам stat:

  • Файл: имя файла.
  • ID: идентификатор файловой системы в шестнадцатеричном формате.
  • Namelen: максимально допустимая длина имен файлов.
  • Тип: тип файловой системы.
  • Размер блока: объем данных, запрашиваемый запросами на чтение для оптимальной скорости передачи данных.
  • Основной размер блока: размер каждого блока файловой системы.

Блоки:

  • Всего: общее количество всех блоков в файловой системе.
  • Свободно: количество свободных блоков в файловой системе.
  • Доступно: количество бесплатных блоков, доступных обычным пользователям (без полномочий root).

Иноды:

  • Всего: общее количество инодов в файловой системе.
  • Свободно: количество свободных инодов в файловой системе.

Разыменование символических ссылок

Если вы используете stat для файла, который на самом деле является символической ссылкой, он сообщит о ссылке. Если вы хотите, чтобы stat сообщал о файле, на который указывает ссылка, используйте параметр -L (разыменование). Файл code.c является символической ссылкой на ana.c . Давайте посмотрим на это без опции -L:

stat code.c

Имя файла показывает code.c, указывающий на ( -> ) ana.c. Размер файла всего 11 байт. Нет блоков, предназначенных для хранения этой ссылки. Тип файла указан как символическая ссылка.

Ясно, что мы не смотрим здесь на настоящий файл. Давайте сделаем это снова и добавим параметр -L:

stat -L code.c

Теперь отображаются сведения о файле, на который указывает символическая ссылка. Но обратите внимание, что имя файла по-прежнему дается как code.c. Это имя ссылки, а не целевого файла. Это происходит потому, что это имя мы передали в stat в командной строке.

Краткий отчет

Параметр -t (краткий) заставляет stat предоставить сжатую сводку:

stat -t ana.c

Никаких подсказок не дано. Чтобы понять это — пока вы не запомните последовательность полей — вам нужно сопоставить этот вывод с полным выводом stat.

Пользовательские форматы вывода

Лучший способ получить другой набор данных из stat — использовать собственный формат. Существует длинный список токенов, называемых последовательностями формата. Каждый из них представляет элемент данных. Выберите те, которые вы хотите включить в вывод, и создайте строку формата. Когда мы вызываем stat и передаем ему строку формата, вывод будет включать только запрошенные нами элементы данных.

Существуют разные наборы последовательностей форматов для файлов и файловых систем. Список для файлов:

  • %a: права доступа в восьмеричном формате.
  • %A: права доступа в удобочитаемой форме (rwx).
  • %b: количество выделенных блоков.
  • %B: размер каждого блока в байтах.
  • %d: десятичный номер устройства.
  • %D: номер устройства в шестнадцатеричном формате.
  • %f: необработанный режим в шестнадцатеричном формате.
  • %F  Тип файла.
  • %g: идентификатор группы владельца.
  • %G: имя группы владельца.
  • %h: количество жестких ссылок.
  • %i: номер инода.
  • %m: точка подключения.
  • %n: имя файла.
  • %N: имя файла в кавычках с разыменованным именем файла, если это символическая ссылка.
  • %o: подсказка по оптимальному размеру передачи ввода-вывода.
  • %s: общий размер в байтах.
  • %t: основной тип устройства в шестнадцатеричном формате для специальных файлов символьных/блочных устройств.
  • %T: дополнительный тип устройства в шестнадцатеричном формате для специальных файлов символьных/блочных устройств.
  • %u: идентификатор пользователя владельца.
  • %U: имя пользователя владельца.
  • %w: время рождения файла, удобочитаемое или дефис -, если неизвестно.
  • %W:  Время создания файла в секундах с начала Эпохи; 0, если неизвестно.
  • %x: время последнего доступа, удобочитаемое.
  • %X: время последнего доступа в секундах с начала эпохи.
  • %y: время последнего изменения данных, удобочитаемое.
  • %Y: время последнего изменения данных в секундах с начала эпохи.
  • %z: время последнего изменения статуса, удобочитаемое.
  • %Z: время последнего изменения статуса в секундах с начала эпохи.

«Эпохой» является эпоха Unix, которая произошла 01.01.1970 00:00:00 +0000 (UTC).

Для файловых систем последовательности форматов следующие:

  • %a: количество бесплатных блоков, доступных обычным пользователям (без полномочий root).
  • %b: общее количество блоков данных в файловой системе.
  • %c: общее количество инодов в файловой системе.
  • %d: количество свободных инодов в файловой системе.
  • %f: количество свободных блоков в файловой системе.
  • %i: идентификатор файловой системы в шестнадцатеричном формате.
  • %l: максимальная длина имен файлов.
  • %n: имя файла.
  • %s: размер блока (оптимальный размер записи).
  • %S: размер блоков файловой системы (для подсчета блоков).
  • %t: тип файловой системы в шестнадцатеричном формате.
  • %T: тип файловой системы в удобочитаемой форме.

Есть два варианта, которые принимают строки последовательностей форматов. Это --format и --printf. Разница между ними заключается в том, что --printf интерпретирует escape-последовательности в стиле C, такие как новая строка \n и табуляция \t , и не выполняет автоматически добавить символ новой строки в свой вывод.

Давайте создадим строку формата и передадим ее в stat. Используемые последовательности форматов: %n для имени файла, %s для размера файла и %F для типа файла. Мы собираемся добавить управляющую последовательность \n в конец строки, чтобы убедиться, что каждый файл обрабатывается с новой строки. Строка нашего формата выглядит так:

"File %n is %s bytes, and is a %F\n"

Мы собираемся передать это в stat с помощью опции --printf. Мы попросим stat сообщить о файле с именем code.c и наборе файлов, соответствующих ana.?. Это полная команда. Обратите внимание на знак равенства «=» между --printf и строкой формата:

stat --printf="File %n is %s bytes, and is a %F\n" code.c ana/ana.?

Отчет по каждому файлу указан с новой строки, что мы и просили. Имя файла, размер файла и тип файла предоставляются нам.

Пользовательские форматы дают вам доступ к большему количеству элементов данных, чем включено в стандартный вывод stat.

Мелкозернистый контроль

Как вы можете видеть, существуют огромные возможности для извлечения конкретных элементов данных, которые вас интересуют. Вероятно, вы также понимаете, почему мы рекомендуем использовать псевдонимы для более длинных и сложных заклинаний.

RELATED: Best Linux Laptops for Developers and Enthusiasts