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

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

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

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

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

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

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

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

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

ls -lh ana.h

ls -lh ana.h в окне терминала

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

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

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

stat ana.h

stat ana.h в окне терминала

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

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

  Как получить доступ к файловой системе ExFat в Ubuntu Linux

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

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

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

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

chmod +w ana.c

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

stat ana.c

chnod + w ana.c в окне терминала

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

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

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

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

stat ana.h ana.o

stat ana.h ana.o в окне терминала

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

stat ana.?

stat ana.?  в окне терминала

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

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

stat -f ana.c

stat -f ana.c в окне терминала

Статистика дает нам следующую информацию:

  Как разместить сервер TeamSpeak в Linux

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

Блоки:

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

Inodes:

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

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

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

stat code.c

stat code.c в окне терминала

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

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

stat -L code.c

stat -L code.c в окне терминала

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

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

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

stat -t ana.c

stat -t ana.c в окне терминала

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

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

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

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

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

  6 бесплатных стратегических игр для загрузки на Linux

«Эпоха» — это Эпоха 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 escape-последовательность в конец строки, чтобы гарантировать, что каждый файл обрабатывается с новой строки. Наша строка формата выглядит так:

"File %n is %s bytes, and is a %Fn"

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

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

stat --printf =

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

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

Контроль мелкого зерна

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