В 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 |