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

Просто включите HTTPS и mod_alias в Apache, и добавляют правило перенаправления как следующее:

<VirtualHost *:80>
                 .
                 .
                 .
    Redirect permanent / https://yoursite.com/
</VirtualHost>

Конфигурация по умолчанию варьируется между Ose/дистрибутивами, таким образом, я не могу быть более конкретным, чем это. Лучше указать Вашу ОС и версии программного обеспечения по вопросам, таким образом, можно получить лучшие ответы ;-).

109
18.09.2013, 15:39
8 ответов

stat -c '%w' file в файловых системах то время создания хранилища.

Обратите внимание, что на Linux это требует coreutils 8.31, glibc 2.28 и версия 4.11 ядра или более новый.

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

Современные файловые системы Linux, такие как ext4, Btrfs и JFS, действительно хранят время создания файла (иначе время рождения), но используют различные названия рассматриваемого поля (crtime в ext4, otime в Btrfs и JFS). Linux обеспечивает statx (2) интерфейс системного вызова для получения времени рождения файла для файловых систем, которые поддерживают его начиная с версии 4.11 ядра.

Поскольку Craig Sanders и Mohsen Pahlevanzadeh указали, stat действительно поддерживает %w и %W спецификаторы формата для отображения времени рождения файла (в человекочитаемом формате и в секундах с Эпохи соответственно) до coreutils версия 8.31. Однако coreutils stat использование statx() системный вызов где это возможно для получения времени рождения только начиная с версии 8.31. До coreutils версия 8.31 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 выводы - (указывание неизвестного времени создания) на Linux до coreutils 8.31 даже для файловых систем, которые действительно хранят время создания внутренне.

Как Stephane Chazelas указывает, некоторые файловые системы, такие как ntfs-3g, выставляют времена создания файла через расширенные атрибуты файла.

92
27.01.2020, 19:29
  • 1
    Можно использовать stap создать Ваше собственное ядро API. Посмотрите пример в ответе здесь. –  rickhg12hs 15.10.2013, 16:12

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 разделах имеют время создания. Вот сценарий оболочки, который определяет inode, связанный с именем файла, и затем увеличивается stat вывод со временем создания при помощи stap ("systemtap").

NB: Это - просто демонстрация и чрезвычайно неэффективный начиная с модуля ядра, создан, загружен и разгружен для каждого выполнения. Это также, вероятно, очень хрупко, поскольку никакая проверка ошибок не выполняется. Надлежащий API ядра был бы предпочтителен, но этот сценарий мог быть сделан намного более эффективным и читать времена создания нескольких files/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
$ 
26
27.01.2020, 19:29
  • 1
    Хорошо, это просто прохладно. +1 для использования stap, обезьяна, исправляющая ядро Linux, потрясающее. –  Chris Magnuson 24.06.2015, 04:20
  • 2
    @ChrisMagnuson: debugfs + stat позвольте добираться crtime без обезьяны, исправляющей ядро. –  jfs 26.07.2016, 16:41

В теории со статистикой GNU Вы могли использовать stat -c '%w' или %W получить дату создания файла (иначе birthtime).

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

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

Linux Weekly News имела интересную статью об этом несколько лет назад - http://lwn.net/Articles/397442/

16
27.01.2020, 19:29
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....!

8
27.01.2020, 19:29
  • 1
    //, Попробованный это на машине CEntOS 6, и все, что я получил, было вопросительными знаками: статистика $ - printf = '% w' ~/dump.rdb? Возможно, моя файловая система не поддерживает статистику с %w. –  Nathan Basanese 21.08.2015, 22:23
  • 2
    , к сожалению, HFS не поддерживает ctime. –  PersianGulf 22.08.2015, 12:33
[112755] В OS X вы можете использовать [113134]ls -lU[113135], [113136] stat -f%B[113137], [113138] GetFileInfo -d[113139], или [113140]mdls -n kMDItemFSCreationDate[113141]:

6
27.01.2020, 19:29

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

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

sudo debugfs -R "stat / АБСОЛЮТ / ПУТЬ "/ dev / sdxX | grep crtime

17
27.01.2020, 19:29

Посмотрите это:

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

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

2
27.01.2020, 19:29

Я использую Ubuntu, и большинство файлов находятся в файловой системе ext4, поэтому мы можем игнорировать случаи в других, таких как Btrfs, XFS (v5 и более поздних )и JFS.

Стандартная файловая система ext4 Linux выделяет место для временной метки создания файла -в своих внутренних структурах файловой системы, но этоеще не реализованоеще (Я пробовал в Ubuntu 20.04)

Используйте это как альтернативу :

stat --format='%z' {{YOUR_file}} 

%z :время последнего изменения состояния , человек -может прочитать. (он же ctime)
ctime:Измененные метки времени не относятся к изменениям, внесенным в содержимое файла. Скорее, это время, когда метаданные , относящиеся к файлу, были изменены. Изменения прав доступа к файлам, например, обновят измененную временную метку.

atime против ctime против. время:
https://www.howtogeek.com/517098/linux-file-timestamps-explained-atime-mtime-and-ctime/

подробнее о метадате файла:
https://www.cs.columbia.edu/~smb/classes/s06-4118/l21.pdf

0
13.11.2021, 02:23

Теги

Похожие вопросы