Я хочу дізнатися дату створення певного файлу, а не дату зміни чи дату доступу.
Я спробував з ls -ltrh
і stat filename
.
stap
для отримання часу створення.
Я хочу дізнатися дату створення певного файлу, а не дату зміни чи дату доступу.
Я спробував з ls -ltrh
і stat filename
.
stap
для отримання часу створення.
Відповіді:
Стандарт POSIX визначає лише три різні часові позначки, які потрібно зберігати для кожного файлу: час останнього доступу до даних, час останньої модифікації даних та час останнього зміни статусу файлу.
Однак, сучасні файлові системи Linux, такі як ext4, Btrfs та JFS, зберігають час створення файлу (він же час народження), але використовують різні назви для відповідного поля ( crtime
у ext4, otime
у Btrfs та JFS). Однак в даний час Linux не надає API ядра для доступу до часу створення файлів навіть у файлових системах, що їх підтримують.
Як зазначали Крейг Сандерс та Мохсен Палеванзаде , stat
вони підтримують специфікатори %w
та %W
формати для відображення часу народження файлу (у читаному для людини форматі та за секунди після Епохи відповідно). Однак, 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 навіть для файлових систем, які зберігають час створення всередині.
Як зазначає Стефан Шазелас , деякі файлові системи, наприклад ntfs-3g, піддають час створення файлів за допомогою розширених атрибутів файлів.
stap
для створення власного API ядра. Дивіться приклад у відповіді тут.
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
Зрозуміло, що вкладиші моїх розділів ext4 мають час створення. Ось скрипт оболонки, який визначає inode, пов’язаний з іменем файлу, а потім збільшує stat
висновок із часом створення за допомогою stap
("systemtap").
NB: Це просто демонстрація і надзвичайно неефективна, оскільки модуль ядра створюється, завантажується та вивантажується для кожного виконання. Це також, ймовірно, дуже крихке, оскільки перевірка помилок не проводиться. Правильний API ядра був би кращим, але цей скрипт можна зробити набагато ефективнішим і прочитати час створення декількох файлів / вкладок.
[вміст 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
$
debugfs + stat
дозвольте дістатись crtime
без мавпи, що латкує ядро.
У ext4
ньому можливо; оскільки ext4
файлова система зберігає час створення файлів. Але все-таки ви виявите, що stat
команда не в змозі показати дату, тому що я думаю, що ядро не має для цього ніяких API.
У будь-якому випадку, час народження файлу зберігається в ньому, ext4
і ви можете дізнатися це, хоча не прямим методом, а за допомогоюdebugfs
sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime
xstat filename
/dev/sdxX
він встановлений, /some/path
а файл є /some/path/some/file
, шлях, який слід вказати, є лише some/file
: його шлях повинен бути спрямований не до кореня файлової системи, а до точки монтажу. Інакше файл не знайдеться.
Теоретично, за допомогою статистики GNU ви можете використовувати stat -c '%w'
або %W
отримати дату створення файлу (він же час народження).
На практиці більшість файлових систем не записують цю інформацію, а ядро Linux не забезпечує жодного способу доступу до неї.
Найближчим ви можете отримати ctime файлу, який не час створення, це час останнього зміни метаданих файлу.
Про щотижневі новини Linux було цікава стаття про це кілька років тому - 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 -d a
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
До речі, це працює лише на ext4. Я не знайшов рішення для BtrFS ... ще;)
stat(1)
.