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

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

Я пробовал с 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 … еще;)

  • Как найти последние n новых файлов для каждой из нескольких каталогов
  • Использовать awk для печати и редактирования даты
  • Изменение измененной даты файла в зависимости от даты в имени файла
  • Как мне выполнить ls, а затем отсортировать результаты по дате?
  • Как отрегулировать временную метку Exif фотографии, используя дату в названии
  • Добавление метки времени в файл журнала с помощью команды cronjob
  • Получить строки между двумя временными метками из файла
  • ls -lu не дает последнего времени доступа
  • Универсальная альтернативная альтернатива non-bash `time`?
  • Команда ls без (скрытия) даты и времени
  • Как определить, действительно ли cp -u скопировал файл?
  • Interesting Posts

    не получить желаемый результат с командой cut?

    Как установить размер шрифта по умолчанию для всех приложений Qt5?

    Сканер Fujitsu ScanSnap IX500 перестает работать, возможно, при обновлении с Debian jessie, чтобы растянуть

    Как я могу использовать mutt execute command tag-pattern, а затем delete-pattern через shell?

    Поиск текстового файла с помощью одной строки с использованием регулярных выражений

    Удалить опцию из включенного файла в PAM

    Как SSH через промежуточный сервер

    Выполнять поиск по двум спискам

    Промежуточные пробелы при копировании с консоли

    Могу ли я удалить или переместить почтовые файлы из папки maildir?

    Сравнение переменной с буквами верхнего и нижнего регистра

    Официальный стандарт / соглашение для расширения файла для сценариев оболочки для источника

    E: обновление python-setuptools завершается неудачно, apt-get broken

    `$ RANDOM` не является случайным в` “ “ “ `Exec“` “ “ “ “ “ “ `

    wheezy: nis / autofs не работает

    Linux и Unix - лучшая ОС в мире.