How to get file creation date/time in Bash/Debian?
I’m using Bash on Debian GNU/Linux 6.0. Is it possible to get the file creation date/time? Not the modification date/time. ls -lh a.txt and stat -c %y a.txt both only give the modification time.
13 Answers 13
Unfortunately your quest won’t be possible in general, as there are only 3 distinct time values stored for each of your files as defined by the POSIX standard (see Base Definitions section 4.8 File Times Update)
Each file has three distinct associated timestamps: the time of last data access, the time of last data modification, and the time the file status last changed. These values are returned in the file characteristics structure struct stat, as described in .
EDIT: As mentioned in the comments below, depending on the filesystem used metadata may contain file creation date. Note however storage of information like that is non standard. Depending on it may lead to portability problems moving to another filesystem, in case the one actually used somehow stores it anyways.
Such sad news. It’d be so useful right now to determine easily whether a file has been deleted and recreated or has been there all along.
Do you know how that works on a Mac? The Finder shows three timestamps as ‘Created’, ‘Modified’, ‘Last openend’.
ls -i file #output is for me 68551981 debugfs -R 'stat ' /dev/sda3 # /dev/sda3 is the disk on which the file exists #results - crtime value [root@loft9156 ~]# debugfs -R 'stat ' /dev/sda3 debugfs 1.41.12 (17-May-2010) Inode: 68551981 Type: regular Mode: 0644 Flags: 0x80000 Generation: 769802755 Version: 0x00000000:00000001 User: 0 Group: 0 Size: 38973440 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 76128 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013 atime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013 mtime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013 **crtime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013** Size of extra inode fields: 28 EXTENTS: (0-511): 352633728-352634239, (512-1023): 352634368-352634879, (1024-2047): 288392192-288393215, (2048-4095): 355803136-355805183, (4096-6143): 357941248-357943295, (6144 -9514): 357961728-357965098
Дата создания файла в Linux
В свойствах файла в файловом менеджере Linux зачастую отображается только информация о дате последнего обращения к нему и дате изменения. Но вот дата создания там, к сожалению, отсутствует. А иногда нужно посмотреть именно ее, например, чтобы узнать, с какого момента ведется запись лога.
В данной статье мы расскажем о том, какие данные хранятся в файловых системах Linux и объясним, как узнать дату создания файла Linux . Будут упомянуты сразу же два удобных способа, каждый из которых со своими особенностями.
Дата создания файла Linux
В стандарте POSIX прописаны только 3 вида временных меток, которые должна хранить файловая система:
- atime – время последнего обращения к файлу.
- mtime – время последнего изменения содержимого.
- ctime – время последней модификации прав доступа или владельца.
По этой причине в старых файловых системах посмотреть информацию о дате создания файла зачастую невозможно. А вот в современных файловых системах (ext4, zfs, XFS и т. д.) она уже сохраняется.
Данные о дате создания записываются в специальном поле:
Есть два удобных способа просмотра этой информации: с помощью утилиты stat и debugfs. Но первый способ подойдет не для всех дистрибутивов Linux. Второй способ – универсальный, но не такой простой в использовании. Разберемся с каждым из них по отдельности.
1. С помощью stat
Утилита stat выводит подробные сведения о файле. В том числе выводится дата создания файла Linux. Для ее запуска в терминале достаточно указать путь к файлу. Для примера посмотрим информацию про изображение pic_1.jpeg, хранящееся в каталоге /home/root-user/Pictures:
Нужная информация записана в графе Создан. А с помощью опции -c получится задать определенные правила форматирования для вывода информации, например, оставив только нужную графу:
stat -c ‘%w’ /home/root-user/Pictures/pic_1.jpeg
отдельной статье. Можете с ней ознакомиться.
2. С помощью debugfs
В отличие от утилиты stat, описанной в предыдущем разделе, у debugfs нет таких ограничений по версии. А значит, она будет работать всегда. Но и процедура использования у нее несколько более запутанная. Связано это с тем, что для просмотра даты создания файла через debugfs, нужно узнать номер его inode и файловую систему. Получить inode выйдет с помощью команды ls с опцией -i, указав путь к файлу:
ls -i /home/root-user/scripts/main_script.txt
А для просмотра файловой системы пригодится команда df:
Теперь все нужные данные собраны, и можно переходить к использованию утилиты debugfs. Ей нужно передать опцию -R, указать номер inode, а затем название файловой системы:
sudo debugfs -R ‘stat ‘ /dev/sda5
Подробное разъяснение о том, что такое inode, есть в специальной статье на нашем сайте.
Выводы
Мы разобрали два способа посмотреть дату создания файла Linux. Утилита stat несколько более удобная, ведь для нее достаточно указать только путь к нему. Но она не будет отображать нужную информацию до версии 8.31 GNU coreutils. А debugfs в этом плане более универсальная, но не такая простая в использовании. Ведь для получения данных она требует ввода номера inode файла и его файловую систему.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Is there a way to know the creation time of a file in ubuntu?
i am using ubuntu and want to know the creation time of a file even when it gets modified or accessed ?
I just noticed that in ext4 (not sure about other FS), if you list with «ls -li» (to list inodes), it seems to display the creation date. I didn’t found any reference to it, so maybe I’m wrong (at least it seems to work for me).
7 Answers 7
Unfortunately Unix does not store the creation time of a file.
All you are able to get using stat is
Note: When using filesystem type ext4 crtime is available!
This little script can get the creation date for ext4:
#!/bin/sh fn=`realpath $1` echo -n "Querying creation time of $1. " sudo debugfs -R "stat $fn" /dev/sda4|grep crtime
I named it fcrtime and put it in my ~/bin folder. So in any folder I can use the command like: fcrtime example.odp
crtime: 0x5163e3f0:12d6c108 — Tue Apr 9 12:48:32 2013
Compared to stat-ing the same file:
File: `example.odp' Size: 54962 Blocks: 112 IO Block: 4096 regular file Device: 804h/2052d Inode: 11019246 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ fulop) Gid: ( 1000/ fulop) Access: 2013-04-09 13:20:05.263016001 +0300 Modify: 2013-04-09 13:20:05.227016001 +0300 Change: 2013-04-09 13:20:05.227016001 +0300 Birth: -
- realpath is usually not installed by default. In Ubuntu eg. install it with sudo apt-get install realpath
- Replace /dev/sda4 if necessary with the one you get from mount|grep ext4