Получить дату и время создания файла

Дату создания файла можно узнать из командной строки с помощью команды dir. Синтаксис для этого приведен ниже.

 dir/T: C filename 

Если нам нужно получить дату и время создания файла для всех файлов и подкаталогов в текущий каталог, команда:

 dir/T: C 

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

 dir/T: C * .pdf 

Приведенная выше команда будет печатать даты создания файлов только для файлов PDF.

Команда для печати даты и времени создания файла только для файлов (пропустить каталоги)

 dir/A: -D/T: C 

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

 dir/A: -D/T: C/O: D 

Пример:

 C: > dir/A: -D/T: C/O: D02/06/2012 19:38 PM 4 4.txt02/06/2012 19:39 PM 0  5.txt02/06/2012 22:45 13 10.txt02/06/2012 22:47 13 newfile.t02/11/2012 20:24 83 2.bat02/11/2012 20:26 5219 data.  txt02/11/2012 20:27 5219 data2.txt02/12/2012 23:28 98 3.bat02/13/2012 10:47 131 echo.bat 


Как мне узнать время создания файла?

Мне нужно узнать время создания файла, когда я читаю в статьях по этой проблеме, все упоминали, что решения нет (например, Site1, Site2).

Когда я попробовал команду stat , в ней говорится: Рождение: - .

Итак, как я могу узнать время создания файла?


Есть способ узнать дату создания каталога, просто выполните следующие действия:

  1. Знать inode каталога командой ls -i (скажем, например, его

  2. Знать на каком разделе сохраняется ваш каталог командой df -T/path (скажем, на /dev/sda1 )

  3. Теперь используйте эту команду: sudo debugfs -R 'stat '/dev/sda1

В выводе вы увидите:

  crtime: 0x4e81cacc: 966104fc - mon Sep 27 14:38:28 2013  

crtime — это дата создания вашего файла.

Что я тестировал :

  1. Создал каталог в определенное время.
  2. Получил доступ к нему.
  3. Изменил его, создав файл.

  4. Я попробовал команду, и она показала точное время.

  5. Затем я изменяю ее и снова проверяю, crtime остался прежним, но время modify и изменилось.

@Nux нашел отличный решение, за которое вы должны проголосовать. Я решил написать небольшую функцию, которую можно использовать для прямого запуска всего. Просто добавьте это в свой ~/.bashrc .

  get_crtime () {для цели в "$ {@}";  do inode = $ (stat -c '% i' "$ {target}") fs = $ (df --output = source "$ {target}" | tail -1) crtime = $ (sudo debugfs -R 'stat   '"$ {fs}" 2>/dev/null | grep -oP' crtime. * -  s *  K. * ') printf "% s  t% s   n "" $ {target} "" $ {crtime} "done}  

Теперь вы можете запустить get_crtime , чтобы распечатать даты создания из сколь угодно большого количества файлов или каталогов:

  $ get_crtime foo foo/file foo Среда 21 мая 17:11:08 2014foo/file среда 21 мая 17:11:27  2014 г.  

11


Неспособность stat показать время создания связана с ограничением системного вызова stat (2) , структура возврата которого не включает поле для времени создания. Однако, начиная с Linux 4.11 (т. Е. 17.10 и новее *), доступен новый системный вызов statx (2) , который включает в свою структуру возврата время создания.

* И, возможно, в более старых версиях LTS, использующих ядра аппаратного стека (HWE). Отметьте uname -r , чтобы проверить, используете ли вы ядро ​​версии не ниже 4.11 для подтверждения.

К сожалению, это непросто для вызова системных вызовов непосредственно в программе C. Обычно glibc предоставляет оболочку, которая упрощает работу, но glibc добавила оболочку для statx (2) только в августе 2018 г. (версия 2.28, доступна в 18.10). Сама команда stat получила поддержку statx (2) только в GNU coreutils 8.31 (выпущенном в марте 2019 г.), однако даже Ubuntu 20.04 имеет только coreutils 8.30 .

Но я не думаю, что это будет перенесено на выпуски LTS, даже если они получат или уже используют новые ядра или glibcs. Итак, я не ожидаю, что stat в любой текущей версии LTS (16.04, 18.04 или 20.04) когда-либо напечатает время создания без ручного вмешательства.

В 18.10 и новее вы можете напрямую использовать функцию statx , как описано в man 2 statx (обратите внимание, что справочная страница 18.10 неверно указано, что glibc еще не добавил оболочку).

А в Ubuntu 20.10 вы сможете использовать stat напрямую:

  # stat --versionstat (GNU coreutils) 8.32 Авторские права (C) 2020 Free Software Foundation, Inc. Лицензия GPLv3 +: GNU GPL версии 3 или новее . Это бесплатное программное обеспечение: вы можете изменять и распространять его. НИКАКИХ ГАРАНТИЙ в пределах, разрешенных законом. Написано Майклом Мескесом. # stat/File:/Size: 4096 Блоки: 8 IO  Блок: 4096 каталог Устройство: 88h/136d Inode: 57279593 Ссылки: 1 Доступ: (0755/drwxr-xr-x) Uid: (0/root) Gid: (0/root) Доступ: 2020-08-18 06:57:46. 912243164 + 0000Изменить: 2020-08-18 06: 57: 06.768492334 + 0000Изменить: 2020-08-18 06: 57: 59.136165661 +0000 Рождение: 2020-08-18 06: 57: 06.768492334 +0000  

К счастью, для старых систем @whotwagner написал образец программы на C, в которой показано, как использовать системный вызов statx (2) на x86 и x86- 64 системы. Его вывод имеет тот же формат, что и формат по умолчанию stat , без каких-либо параметров форматирования, но его просто изменить, чтобы вывести только время рождения.

Во-первых, клонировать его:

  git clone https://github.com/whotwagner/statx-fun

Вы можете скомпилировать statx.c или, если вам просто нужно время рождения, создайте Birth.c в клонированном каталоге со следующим кодом (который является минимальным версия statx.c , печатающая только временную метку создания с точностью до наносекунды):

  #define _GNU_SOURCE # define _ATFILE_SOURCE # include  #include  #include  #include  #include  #include "statx.h" #include  #include  #include //(пока) не предоставляет оболочку для системного вызова statx () # include /* этот код работает только с x86 и x86_64 */# if __x86_64__  #define __NR_statx 332 # else # define __NR_statx 383 # endif # define statx (a,  b, c, d, e) системный вызов (__ NR_statx, (a), (b), (c), (d), (e)) int main (int argc, char * argv []) {int dirfd = AT_FDCWD;  int flags = AT_SYMLINK_NOFOLLOW;  unsigned int mask = STATX_ALL;  struct statx stxbuf;  длинный ret = 0;  int opt ​​= 0;  while ((opt = getopt (argc, argv, "alfd"))! = -1) {switch (opt) {case 'a': flags | = AT_NO_AUTOMOUNT;  перемена;  case 'l': флаги & = ~ AT_SYMLINK_NOFOLLOW;  перемена;  case 'f': флаги & = ~ AT_STATX_SYNC_TYPE;  флаги | = AT_STATX_FORCE_SYNC;  перемена;  case 'd': флаги & = ~ AT_STATX_SYNC_TYPE;  флаги | = AT_STATX_DONT_SYNC;  перемена;  по умолчанию: выход (EXIT_SUCCESS);  перемена;  }} если (optind> = argc) {выход (EXIT_FAILURE);  } for (; optind  

Затем:

  $ make Birth $ ./birth ./birth.c1511793291.254337149$. /Birth ./birth.c |  xargs -I {} date -d @ {} Mon Nov 27 14:34:51 UTC 2017  

Теоретически это должно сделать время создания более доступным:

  • Должно поддерживаться больше файловых систем, чем только ext * ( debugfs — это инструмент для файловых систем ext2/3/4, который нельзя использовать в других)
  • вам не нужен root, чтобы использовать это (за исключением установки некоторых необходимых пакетов, таких как make и linux-libc-dev ).

Тестирование системы xfs, например:

  $ truncate -s 1G temp;  mkfs -t xfs temp;  mkdir foo;  sudo mount temp foo;  sudo chown $ USER foo $ touch foo/bar $ # через некоторое время $ echo> foo/bar $ chmod og-w foo/bar $ ./birth foo/bar |  xargs -I {} date -d @ {} Пн, 27 ноября, 14:43:21 UTC 2017 $ stat foo/bar Файл: foo/bar Размер: 1 Блоки: 8 Блок ввода-вывода: 4096 обычный файл Устройство: 700h/1792d Inode: 99  Ссылки: 1 Доступ: (0644/-rw-r - r--) Uid: (1000/muru) Gid: (1000/muru) Доступ: 2017-11-27 14: 43: 32.845579010 + 0000 Изменить: 2017-11-  27 14: 44: 38.809696644 + 0000Change: 2017-11-27 14: 44: 45.536112317 +0000 Рождение: -  

Однако это не сработало для NTFS и exfat. Думаю, файловые системы FUSE для них не включали время создания.

3


TL; DR: Просто запустите: sudo debugfs -R 'stat/path/to/your/file'/dev /

(Чтобы выяснить вашу fs, выполните df -T/path/to/your/file , скорее всего, это будет /dev/sda1 ).

Длинная версия:

Мы собираюсь запустить две команды:

  1. Узнать имя раздела для вашего файла.

       df -T/path/to/your/file  

    Результат будет выглядеть следующим образом (сначала имя раздела):

      Тип файловой системы Используемые блоки размером 1К Доступно Использовать% Установлено на/dev/ ext4 7251432 3481272 3509836 50%/ 
  2. Узнайте время создания этого файла.

      sudo debugfs -R 'stat/path/to/your/file'/dev/   

    В выводе найдите ctime.


Моя ОС (Ubuntu 20.04, которая поставляется с ядром Linux 5.4 .0-28 и GLIBC 2.31) поставлялись только с GNU coreutils 8.30, поэтому мне пришлось заставить его работать, скомпилировав версию 8.32 GNU coreutils из исходников. Это была относительно безболезненная процедура.

После этого и ls , и stat могли работать со временем рождения.

Вывод ls -l --time = Birth --time-style = full-iso --no-group :

Вывод stat в файловой системе ext4 и файловой системе btrfs:

(скопировано из моего другого ответа на UNIX и Linux Stack Exchange)

Оцените статью
clickpad.ru
Добавить комментарий