Как найти дату создания файла?

Я хочу узнать дату создания конкретного файла, а не дату изменения или дату доступа.

Я пробовал с ls -ltrh и stat filename .

7 Solutions collect form web for “Как найти дату создания файла?”

Стандарт POSIX определяет только три отдельных временных метки для каждого файла: время последнего доступа к данным, время последней модификации данных и время последнего изменения статуса файла.

Тем не менее, современные файловые системы Linux, такие как ext4, Btrfs и JFS, сохраняют время создания файла (также время рождения), но используют разные имена для данного поля ( crtime в ext4, otime в Btrfs и JFS). Однако в настоящее время Linux не предоставляет API-интерфейс ядра для доступа к временам создания файла , даже в поддерживающих их файловых системах.

Как отметил Крейг Сандерс и Мохсен Пахлеванзаде , stat поддерживает спецификаторы формата %w и %W для отображения времени рождения файла (в человекообразном формате и в секундах с Epoch соответственно). Тем не менее, stat сам получает доступ к времени рождения через get_stat_birthtime() предоставляемый gnulib (в lib/stat-time.h ), который получает время рождения из полей st_birthtime и st_birthtimensec структуры stat возвращаемых системным вызовом stat() , Хотя, например, BSD-системы (и в расширении OS X) предоставляют st_birthtime через stat , Linux этого не делает. Вот почему stat -c '%w' file выводит stat -c '%w' file (указывающий на неизвестное время создания) на Linux даже для файловых систем, которые хранят время создания внутри.

Как указывает Стефан Шазелас , некоторые файловые системы, такие как ntfs-3g, раскрывают времена создания файла с помощью расширенных атрибутов файла.

TLDR; Используйте stap ( «SystemTap» ) для создания собственного API ядра. Ниже приведен пример извлечения времени создания ext4.

Вы можете извлечь время создания ext4 в системах Fedora 19. Вот мой:

 $ uname -a Linux steelers.net 3.11.1-200.fc19.i686.PAE #1 SMP Sat Sep 14 15:20:42 UTC 2013 i686 i686 i386 GNU/Linux 

Понятно, что inodes на моих ext4-разделах имеют время создания. Вот сценарий оболочки, который определяет индексный дескриптор, связанный с именем файла, а затем добавляет результат stat с временем создания, используя stap («systemtap»).

NB: Это просто демо-версия и очень неэффективна, поскольку модуль ядра создается, загружается и выгружается для каждого исполнения. Это также, вероятно, очень хрупко, поскольку проверка ошибок не выполняется. Правильный API ядра предпочтительнее, но этот скрипт можно сделать намного более эффективным и прочитать время создания нескольких файлов / inodes.

[содержимое stap_stat.sh]

 #/bin/sh my_inode_str=$(stat --printf="%i" $1) stap - << end_of_stap_script global my_offsetof probe begin { system("stat $1"); my_offsetof = &@cast(0,"struct ext4_inode_info")->vfs_inode; } probe kernel.function("ext4_getattr@fs/ext4/inode.c") { probe_inode=\$dentry->d_inode; if (@cast(probe_inode, "struct inode")->i_ino == $my_inode_str) { my_i_crtime = &@cast(probe_inode - my_offsetof,"struct ext4_inode_info")->i_crtime; printf("CrTime: %s GMT\n", ctime(@cast(my_i_crtime, "timespec")->tv_sec)); printf("CrTime (nsecs): %d\n", @cast(my_i_crtime, "timespec")->tv_nsec); exit(); } } end_of_stap_script 

Вот демо:

 $ ll testfile ls: cannot access testfile: No such file or directory $ touch testfile $ ./stap_stat.sh testfile File: 'testfile' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd02h/64770d Inode: 4850501 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick) Context: unconfined_u:object_r:user_home_t:s0 Access: 2013-09-28 06:17:04.221441084 -0400 Modify: 2013-09-28 06:17:04.221441084 -0400 Change: 2013-09-28 06:17:04.221441084 -0400 Birth: - CrTime: Sat Sep 28 10:17:04 2013 GMT CrTime (nsecs): 220441085 $ ll testfile -rw-rw-r--. 1 Rick Rick 0 Sep 28 06:17 testfile $ cat - >> testfile Now is the time ... $ ll testfile -rw-rw-r--. 1 Rick Rick 20 Sep 28 06:18 testfile $ ./stap_stat.sh testfile File: 'testfile' Device: fd02h/64770d Inode: 4850501 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick) Context: unconfined_u:object_r:user_home_t:s0 Access: 2013-09-28 06:17:04.221441084 -0400 Modify: 2013-09-28 06:18:33.684374740 -0400 Change: 2013-09-28 06:18:33.684374740 -0400 Birth: - CrTime: Sat Sep 28 10:17:04 2013 GMT CrTime (nsecs): 220441085 $ cat testfile Now is the time ... $ ./stap_stat.sh testfile File: 'testfile' Size: 20 Blocks: 8 IO Block: 4096 regular file Device: fd02h/64770d Inode: 4850501 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick) Context: unconfined_u:object_r:user_home_t:s0 Access: 2013-09-28 06:19:12.199349463 -0400 Modify: 2013-09-28 06:18:33.684374740 -0400 Change: 2013-09-28 06:18:33.684374740 -0400 Birth: - CrTime: Sat Sep 28 10:17:04 2013 GMT CrTime (nsecs): 220441085 $ mv testfile testfile2 $ ./stap_stat.sh testfile2 File: 'testfile2' Size: 20 Blocks: 8 IO Block: 4096 regular file Device: fd02h/64770d Inode: 4850501 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ Rick) Gid: ( 1001/ Rick) Context: unconfined_u:object_r:user_home_t:s0 Access: 2013-09-28 06:19:12.199349463 -0400 Modify: 2013-09-28 06:18:33.684374740 -0400 Change: 2013-09-28 06:20:45.870295668 -0400 Birth: - CrTime: Sat Sep 28 10:17:04 2013 GMT CrTime (nsecs): 220441085 $ 

В ext4 это возможно; потому что файловая система ext4 хранит время создания файла. Но все же вы обнаружите, что команда stat не может показать дату, это потому, что я думаю, что у ядра все еще нет API-интерфейсов.

В любом случае время рождения файла хранится в ext4 и вы можете найти его, хотя это не прямой метод, но используя debugfs

sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime

Теоретически, с помощью GNU stat вы можете использовать stat -c '%w' или %W чтобы получить дату создания файла (или время рождения).

На практике большинство файловых систем не записывают эту информацию, и ядро ​​linux не предоставляет никакого доступа к ней.

Самое близкое, что вы можете получить, это ctime файла, который не является временем создания, это время, когда метаданные файла были в последний раз изменены.

В Linux Weekly News появилась интересная статья об этом несколько лет назад – http://lwn.net/Articles/397442/

 stat --printf='%w' yourfile #human readable stat --printf='%W' yourfile #seconds from Epoch , 0 if unknown 

Разница между FreeBSD и GNU\Linux по stat command :

Если вы вызываете команду stat в GNU\Linux она вызывает параметр -x , но во FreeBSD вы должны вызывать параметр -x .

См. Также Какие файловые системы в Linux хранят время создания?

Примечания: --printf очень полезен при scripting ….!

В OS X вы можете использовать ls -lU , stat -f%B , GetFileInfo -d или mdls -n kMDItemFSCreationDate :

 $ ls -lU total 0 -rw-r--r-- 1 lauri staff 0 Apr 25 03:58 a $ stat -f%B a 1398387538 $ stat -f%SB -t %Y%m%d%H%M a 201404250358 $ GetFileInfo -da 04/25/2014 03:58:58 $ mdls -n kMDItemFSCreationDate a kMDItemFSCreationDate = 2014-04-25 00:58:58 +0000 

Проверь это:

 # the last arg is the device to scan in. debugfs -R 'stat /home/renich/somefile' /dev/sda1 

BTW, это работает только на ext4. Я не нашел решение для BtrFS … еще;)

  • Как использовать mogrify convert только в файлах с определенной датой создания?
  • получить исходную дату создания html-файла
  • rsync и резервное копирование и изменение часового пояса
  • Корреляция / var / log / * timestamps
  • Использует ли `git archive` неправильную временную метку файла?
  • В Ubuntu - / var / log / messages отметки времени на 4 минуты вперед
  • Изменить временную метку файла и время показа вместо года с помощью ls
  • Найти изображения с одинаковой временной отметкой exif
  • Список файлов с момента времени X до времени Y
  • Удалите все файлы в папке, кроме последней (последней) 20
  • эпоха для GMT
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.