Мне нужно найти время создания файла, когда я прочитал несколько статей по этой проблеме, все упомянули, что решения не существует (например, Site1 , Site2 ).
Когда я попробовал stat
команду, она заявляет Birth: -
.
Итак, как я могу найти время создания файла?
Ответы:
Есть способ узнать дату создания каталога, просто выполните следующие действия:
Знать индекс каталога по
ls -i
команде (скажем, например, его X )Знайте, на каком разделе ваш каталог сохраняется
df -T /path
командой (скажем, он включен/dev/sda1
)Теперь используйте эту команду:
sudo debugfs -R 'stat <X>' /dev/sda1
Вы увидите в выводе:
crtime - это дата создания вашего файла.
Что я тестировал :
Модифицировал его, создав файл.
Я попробовал команду, и она дала точное время.
источник
debugfs
извлекает его непосредственно из файловой системы, поэтому ему не нужно использовать API ядра. Смотрите здесь .statx()
с марта 2019 года.@Nux нашел отличное решение для этого, которое вы все должны поддержать. Я решил написать небольшую функцию, которую можно использовать для непосредственного запуска всего. Просто добавьте это к себе
~/.bashrc
.Теперь вы можете запустить,
get_crtime
чтобы напечатать даты создания любого количества файлов или каталогов:источник
cp -p
или подобным.df
не поддерживает эту--output
опцию. В этом случае вы можете заменить эту строку на,fs=$(df foo | awk '{a=$1}END{print a}'
и функция также будет работать. Все, что я показываю в этом ответе, - это способ обернуть команду из принятого ответа таким образом, чтобы ее можно было запустить непосредственно для целей файла / каталога.Невозможность
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). К счастью, @whotwagner написал пример программы на C, которая показывает, как использоватьstatx(2)
системный вызов в системах x86 и x86-64. Его вывод имеет тот же формат, чтоstat
и по умолчанию, без каких-либо параметров форматирования, но его просто изменить, чтобы вывести только время рождения.Сначала клонируем это:
Вы можете скомпилировать
statx.c
код или, если вам нужно только время рождения, создатьbirth.c
в клонированном каталоге следующий код (это минимальная версияstatx.c
печати только метки времени создания, включая наносекундную точность):Затем:
Теоретически это должно сделать время создания более доступным:
debugfs
это инструмент для файловых систем ext2 / 3/4, и его нельзя использовать в других)make
иlinux-libc-dev
).Тестирование системы xfs, например:
Однако это не сработало для NTFS и exfat. Я предполагаю, что файловые системы FUSE для них не включают время создания.
Если, а точнее когда, glibc добавит поддержку
statx(2)
системного вызова,stat
скоро последует, и мы сможем использовать для этого простую старуюstat
команду. Но я не думаю, что это будет перенесено в релизы LTS, даже если они получат более новые ядра. Так что я не ожидаю, чтоstat
в какой-либо текущей версии LTS (14.04, 16.04 или 18.04) когда-либо будет напечатано время создания без ручного вмешательства.Однако в 18.10 вы можете напрямую использовать
statx
функцию, как описано вman 2 statx
(обратите внимание, что man-страница 18.10 неверна, заявив, что glibc еще не добавил оболочку).источник
1
?TL; DR: Просто беги:
sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
(Чтобы выяснить свой фс, бегите
df -T /path/to/your/file
, скорее всего, так и будет/dev/sda1
).Длинная версия:
Мы собираемся запустить две команды:
Узнайте название раздела имя для вашего файла.
Вывод будет выглядеть так (имя раздела первое):
Узнайте время создания этого файла.
В выходных ищите
ctime
.источник