Команда 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`.
Детальний контроль
Як бачите, є безліч можливостей для вилучення потрібних елементів даних. Саме тому ми рекомендуємо використовувати псевдоніми для довгих та складних команд.