PQ
PQ.Hosting

Валюта

Как узнать дату создания файла в Linux: stat, debugfs и crtime

Автор
PQ
12 марта 2026
4 мин чтения
29 просмотров
Как узнать дату создания файла в Linux: stat, debugfs и crtime

В Linux три временны́е метки — время обращения, изменения и смены прав — хранятся всегда. А вот дата создания в POSIX-стандарте не предусмотрена, поэтому файловые менеджеры её и не показывают. Но она там есть — просто лежит глубже. Разбираем как её достать.

Почему дата создания не видна сразу

Стандарт POSIX определяет три временны́е метки файла:

  • atime — время последнего обращения (чтения)
  • mtime — время последнего изменения содержимого
  • ctime — время изменения метаданных: прав доступа, владельца

Дата создания (crtime или btime) — четвёртая метка, которую POSIX не требует. Поэтому старые файловые системы её не хранят совсем, а современные — хранят в своём поле:

Файловая система Поле
ext4 crtime
XFS crtime
ZFS crtime
Btrfs otime
JFS di_otime

На ext4, xfs и btrfs дата создания есть всегда — просто инструменты для её просмотра нужны правильные.

Способ 1: stat — быстро, но не везде

Утилита stat выводит все метаданные файла включая дату создания:

stat /path/to/file.txt

В выводе будет строка Создан (или Birth в английской локали). Если там стоит прочерк - — значит либо файловая система не поддерживает crtime, либо версия stat слишком старая.

Вывести только дату создания:

stat -c '%w' /path/to/file.txt

%w — формат для даты создания. Если вернётся пустая строка — переходить к способу 2.

Почему stat может не показывать дату создания

Поддержка crtime в stat появилась в GNU coreutils версии 8.31 (через системный вызов statx в glibc 2.28). На Ubuntu 20.04 поле пустое — версия coreutils там 8.30. На Ubuntu 22.04 и 24.04 всё работает.

Проверить версию:

stat --version

Способ 2: debugfs — универсально, работает везде

debugfs — отладчик файловой системы ext2/ext3/ext4. Работает независимо от версии glibc и coreutils. Нужны три шага.

Шаг 1: узнать inode файла

ls -i /path/to/file.txt

Число в начале строки — номер inode. Запомнить его.

Шаг 2: узнать устройство файловой системы

df /path/to/file.txt

В колонке Filesystem будет имя устройства — например /dev/sda5 или /dev/nvme0n1p2.

Шаг 3: запустить debugfs с inode

sudo debugfs -R 'stat <INODE>' /dev/sda5

Заменить INODE на число из шага 1, /dev/sda5 — на устройство из шага 2.

В выводе найти строку crtime — это и есть дата создания файла.

Способ 3: xstat / statx — для XFS и Btrfs

На XFS-разделах debugfs не работает (он только для ext). Использовать xstat из пакета xfsprogs:

sudo apt install xfsprogs
xstat /path/to/file.txt

Или через Python с вызовом statx напрямую — работает на любой современной файловой системе:

python3 -c "
import ctypes, os
STATX_BTIME = 0x800
class Timespec(ctypes.Structure):
    _fields_ = [('tv_sec', ctypes.c_int64), ('tv_nsec', ctypes.c_uint32)]
class Statx(ctypes.Structure):
    _fields_ = [('stx_mask', ctypes.c_uint32), ('stx_blksize', ctypes.c_uint32),
                ('stx_attributes', ctypes.c_uint64), ('stx_nlink', ctypes.c_uint32),
                ('stx_uid', ctypes.c_uint32), ('stx_gid', ctypes.c_uint32),
                ('stx_mode', ctypes.c_uint16), ('__spare0', ctypes.c_uint16),
                ('stx_ino', ctypes.c_uint64), ('stx_size', ctypes.c_uint64),
                ('stx_blocks', ctypes.c_uint64), ('stx_attributes_mask', ctypes.c_uint64),
                ('stx_atime', Timespec), ('stx_btime', Timespec),
                ('stx_ctime', Timespec), ('stx_mtime', Timespec)]
libc = ctypes.CDLL(None)
buf = Statx()
libc.statx(0, b'/path/to/file.txt', 0, STATX_BTIME, ctypes.byref(buf))
import datetime
print(datetime.datetime.fromtimestamp(buf.stx_btime.tv_sec))
"

Однострочник для быстрой проверки

Узнать дату создания файла одной командой — inode и устройство определятся автоматически:

sudo debugfs -R "stat <$(ls -i /path/to/file.txt | awk '{print $1}')>" $(df /path/to/file.txt | tail -1 | awk '{print $1}') 2>/dev/null | grep crtime

Заменить /path/to/file.txt на нужный путь — остальное скрипт сделает сам.

Шпаргалка

Задача Команда
Все метки включая дату создания stat /path/to/file
Только дата создания (stat) stat -c '%w' /path/to/file
Версия stat stat --version
Inode файла ls -i /path/to/file
Устройство файловой системы df /path/to/file
Дата создания через debugfs sudo debugfs -R 'stat <INODE>' /dev/sdaX
Только строка crtime sudo debugfs -R 'stat <INODE>' /dev/sdaX 2>/dev/null | grep crtime

Поделиться статьей

Похожие статьи