Як використовувати команду stat в Linux

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

`stat`: Погляд зсередини на файли

Команда `ls` чудово виконує свої основні функції, але в Linux завжди є можливість дослідити глибше і побачити приховані деталі. Це не просто поверхневе вивчення, а справжнє заглиблення, що дозволяє розібратися в структурі файлів як у цибулині.

`ls` надає основну інформацію, таку як права доступу, розмір файлу та тип (файл, символічне посилання тощо). Ця інформація береться з структури файлової системи під назвою inode.

Кожен файл і каталог має унікальний індекс. Inode зберігає метадані про файл, наприклад, які блоки файлової системи він займає, та мітки часу, пов’язані з файлом. Inode можна порівняти з бібліотечною карткою для файлу, але `ls` показує лише її частину. Щоб побачити всю інформацію, потрібно використовувати команду `stat`.

Команда `stat`, подібно до `ls`, має численні опції, що робить її ідеальною для використання псевдонімів. Після визначення потрібних параметрів, їх можна зберегти у вигляді псевдоніма або функції, що значно спростить використання та позбавить необхідності запам’ятовувати довгі рядки команд.

Швидке порівняння з `ls`

Давайте порівняємо вихідні дані `ls` та `stat`. Використаємо `ls` з опціями `-l` (довгий список) та `-h` (розміри файлів у зручному для читання форматі):

ls -lh ana.h

Інформація, яку надає `ls` (зліва направо):

  • Перший символ (“-“) вказує, що це звичайний файл.
  • Дозволи власника, групи та інших користувачів у вісімковому форматі.
  • Кількість жорстких посилань на файл (зазвичай 1).
  • Власник файлу (Дейв).
  • Група, до якої належить власник (Дейв).
  • Розмір файлу (802 байти).
  • Дата та час останньої зміни файлу.
  • Назва файлу (`ana.c`).

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

stat ana.h

Інформація, яку надає `stat`:

  • Файл: Назва файлу. Зазвичай збігається з назвою, переданою в командному рядку, але може відрізнятися при аналізі символічних посилань.
  • Розмір: Розмір файлу в байтах.
  • Блоки: Кількість блоків файлової системи, необхідних для зберігання файлу на диску.
  • IO Block: Розмір блоку файлової системи.
  • Тип файлу: Тип об’єкта (файл, каталог, посилання, сокет, іменований канал).
  • Пристрій: Ідентифікатор пристрою (жорсткого диска), де зберігається файл, у шістнадцятковому та десятковому форматах.
  • Inode: Номер inode. Унікальний ідентифікатор файлу у файловій системі.
  • Посилання: Кількість жорстких посилань на файл. Для каталогів це число включає записи “.” та “..”.
  • Доступ: Права доступу у вісімковій (наприклад, 777) і rwx (наприклад, rwxrwxrwx) формах.
  • Uid: Ідентифікатор користувача та ім’я власника.
  • Gid: Ідентифікатор групи та назва групи власника.
  • Доступ: Мітка часу останнього доступу до файлу. Завдяки оптимізації `relatime` вона оновлюється, якщо старіша за час зміни.
  • Змінити: Мітка часу останньої зміни вмісту файлу.
  • Змінити: Мітка часу останньої зміни атрибутів або вмісту файлу.
  • Народження: Зарезервоване для дати створення файлу, але не реалізоване в Linux.

Мітки часу: глибше розуміння

Мітки часу залежать від часового поясу. Наприклад, “-0500” вказує, що файл був створений в часовому поясі UTC, на п’ять годин відмінному від поточного. Тому, якщо комп’ютер, що переглядає файл, знаходиться, наприклад, в східному стандартному часі США, мітки часу відобразять різницю в часі.

Розрізнення між мітками часу “зміна” та “змінити” може бути заплутаним, оскільки їхні назви звучать дуже схоже.

Давайте використаємо `chmod`, щоб змінити права доступу файлу `ana.c`, зробивши його доступним для запису всім. Це змінить атрибути, але не вміст файлу:

chmod +w ana.c

Тепер подивимось на мітки часу:

stat ana.c

Мітка часу “змінити” оновилася, а “зміна” – ні.

Мітка “зміни” оновлюється лише при зміні вмісту файлу, тоді як “змінити” оновлюється при зміні як вмісту, так і атрибутів файлу.

`stat` з декількома файлами

Щоб отримати звіт для декількох файлів одночасно, потрібно просто передати їхні імена в командний рядок `stat`:

stat ana.h ana.o

Для роботи з групами файлів використовуйте шаблони. Символ “?” позначає будь-який окремий символ, а “*” – будь-який рядок символів. Ось приклад, як отримати звіт для файлів “ana” з односимвольним розширенням:

stat ana.?

Звіт про файлові системи

`stat` може звітувати не тільки про файли, але й про стан файлових систем. Опція `-f` (файлова система) повідомляє `stat` про файлову систему, де знаходиться вказаний файл. Замість імені файлу можна передати каталог, наприклад, `/`.

stat -f ana.c

Інформація, яку надає `stat -f`:

  • Файл: Назва файлу або каталогу.
  • ID: Ідентифікатор файлової системи у шістнадцятковому форматі.
  • Namelen: Максимальна довжина імені файлу.
  • Тип: Тип файлової системи.
  • Розмір блоку: Розмір блоку для запитів читання/запису.
  • Розмір основного блоку: Розмір одного блоку файлової системи.

Блоки:

  • Усього: Загальна кількість блоків у файловій системі.
  • Вільно: Кількість вільних блоків.
  • Доступно: Кількість вільних блоків, доступних звичайним користувачам.

Іноди:

  • Усього: Загальна кількість інодів у файловій системі.
  • Вільно: Кількість вільних інодів.

Розбір символічних посилань

Якщо `stat` використовується для символічного посилання, він звітує про посилання. Для отримання інформації про файл, на який вказує посилання, потрібно використовувати опцію `-L` (розбір посилань). У прикладі, `code.c` є символічним посиланням на `ana.c`. Без опції `-L`:

stat code.c

Тут вказано, що `code.c` є символічним посиланням на `ana.c`, його розмір 11 байт, тип файлу — символічне посилання.

З опцією `-L`:

stat -L code.c

Тепер ми бачимо деталі файлу, на який вказує символічне посилання. Важливо зауважити, що назва файлу залишається `code.c`, оскільки це ім’я, передане в командному рядку.

Стислий звіт

Опція `-t` (стисло) змушує `stat` надати короткий звіт:

stat -t ana.c

Цей формат вимагає запам’ятовування порядку полів, оскільки не містить підказок.

Спеціальні формати виводу

Для отримання специфічних даних з `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-час, починаючи з 1970-01-01 00:00:00 +0000 (UTC).

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

  • `%a`: Кількість вільних блоків (звичайні користувачі).
  • `%b`: Загальна кількість блоків.
  • `%c`: Загальна кількість інодів.
  • `%d`: Кількість вільних інодів.
  • `%f`: Кількість вільних блоків.
  • `%i`: Ідентифікатор файлової системи (шістнадцятковий).
  • `%l`: Максимальна довжина імені файлу.
  • `%n`: Ім’я файлу.
  • `%s`: Розмір блоку (оптимальний для запису).
  • `%S`: Розмір блоку файлової системи.
  • `%t`: Тип файлової системи (шістнадцятковий).
  • `%T`: Тип файлової системи (читабельний).

Існують дві опції для використання рядків форматних послідовностей: `–format` та `–printf`. `–printf` інтерпретує escape-послідовності у стилі C (наприклад, `\n` для нового рядка, `\t` для табуляції) і не додає автоматично нового рядка до виводу.

Створимо приклад рядка форматування, що містить ім’я файлу (`%n`), розмір файлу (`%s`) та тип файлу (`%F`). Додамо `\n` в кінці для переходу на новий рядок:

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

Використаємо цей формат з опцією `–printf`, щоб отримати дані для файлу `code.c` та групи файлів, що відповідають шаблону `ana.?`:

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

Результат відображається у новому рядку для кожного файлу, як ми і запитували. Звіт містить ім’я, розмір та тип файлу.

Користувацькі формати надають доступ до ще більшої кількості елементів даних, ніж стандартний вивід `stat`.

Детальний контроль

Як бачите, є безліч можливостей для вилучення потрібних елементів даних. Саме тому ми рекомендуємо використовувати псевдоніми для довгих та складних команд.