Подтвердить что ты не робот

Получить время создания файла с помощью Python on linux

os.stat возвращает атрибуты st_mtime и st_ctime, время модификации - st_mtime и st_ctime "время изменения" на POSIX. есть ли какая-либо функция, возвращающая время создания файла с помощью python и под Linux?

4b9b3361

Ответ 1

Вы, вероятно, не можете.:

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

Вы не можете - он нигде не хранится. Файлы имеют последнее изменение   время (показанное "ls -l" ), время последнего доступа (показано "ls -lu" )   и время изменения inode (показано "ls -lc" ). Последнее часто   называемый "временем создания" - даже на некоторых страницах руководства -   но это неправильно; он также устанавливается такими операциями, как mv, ln,   chmod, chown и chgrp.

Страница man для "stat (2)" обсуждает это.

Ответ 2

попробовать:

st_birthtime

Он не гарантированно доступен на всех системах. Из документов:

В некоторых системах Unix (таких как Linux) следующие атрибуты также могут быть доступно: st_blocks (количество блоков выделено для файла), st_blksize (блокирование файловой системы), st_rdev (тип устройства, если устройство inode). st_flags (пользовательские флаги для файл).

В других системах Unix (таких как FreeBSD), следующие атрибуты могут быть доступным (но может быть заполнено только если root пытается их использовать): st_gen (номер генерации файла), st_birthtime (время создания файла).

http://docs.python.org/2/library/os.html#os.stat

Ответ 3

Из-за отсутствия хорошей утилиты я создал crtime.

pip install crtime

Тогда вы можете использовать его как:

sudo crtime ./

Будет печатать:

1552938281  /home/pascal/crtime/.gitignore
1552938281  /home/pascal/crtime/README.md
1552938281  /home/pascal/crtime/crtime
1552938281  /home/pascal/crtime/deploy.py
1552938281  /home/pascal/crtime/setup.cfg
1552938281  /home/pascal/crtime/setup.py
1552938961  /home/pascal/crtime/crtime.egg-info
1552939447  /home/pascal/crtime/.git
1552939540  /home/pascal/crtime/build
1552939540  /home/pascal/crtime/dist

Обратите внимание, что для больших каталогов это будет легко в 1000 раз быстрее, чем xstat выше, так как это создает временный файл, а затем выполняет stat вызовы для всех файлов одновременно.

В python (не забудьте, что вам все равно нужно вызывать его с помощью sudo в linux):

from crtime import get_crtimes, get_crtimes_in_dir
get_crtimes_in_dir("./")

Ответ 4

Вы можете объяснить, почему вы хотите это сделать.

Косвенным решением может быть использование системы контроля версий (например, системы управления версиями = VCS) для управления файлами, время рождения которых необходимо.

Таким образом, вы можете использовать git для таких файлов (т.е. обрабатывать их как "исходный код" ). Тогда вы знаете не только, когда они были созданы (фактически зарегистрированы в VCS с использованием git add), но почему, кем, зачем и т.д. Используйте git log, чтобы получить все это...

Конечно, вам как-то нужно научить ваших пользователей использовать VCS, например git

Ответ 5

В соответствии с потоком здесь OS X HFS и Microsoft NTFS также отслеживают время рождения, и мне говорят OS X и Cygwin версии stat() возвращают эту информацию. который смотрит на osx stat manpage, кажется правильным, по крайней мере, для mac:

a, m, c, B

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

Для linux более новых файловых систем, таких как ext4, Btrfs и JFS, поддерживайте это с помощью debugfs, есть функция bash, взятая из здесь, который будет извлекать временную метку, созданную датой:

Вы можете восстановить дату создания файла, если имеете дело с способной файловой системой, такой как EXT4 - файловая система ведения журнала для Linux:

Улучшенные временные метки

... Ext4 предоставляет временные метки, измеренные в наносекундах. Кроме того, ext4 также добавляет поддержку созданных дат временных меток. Но в сообществе нет консенсуса по этому поводу.

... как указывает Теодор Цо, в то время как в inode легко добавить дополнительное поле даты создания (таким образом, технически поддерживая создаваемые датой временные метки в ext4), сложнее изменить или добавьте необходимые системные вызовы, такие как stat() (для которых, вероятно, потребуется новая версия), и различные библиотеки, зависящие от них (например, glibc). Эти изменения потребуют координации многих проектов. Поэтому, даже если разработчики ext4 реализуют первоначальную поддержку временных меток даты создания, эта функция пока недоступна для пользовательских программ. Который заканчивается финальной цитатой Linus

Подождите пять лет и посмотрите, есть ли на самом деле какой-либо консенсус по поводу того, что он нужен и используется вообще, вместо того, чтобы спешить во что-то только потому, что "мы можем".

xstat() {
  for target in "${@}"; do
    inode=$(ls -di "${target}" | cut -d ' ' -f 1)
    fs=$(df "${target}"  | tail -1 | awk '{print $1}')
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*')
    printf "%s\t%s\n" "${crtime}" "${target}"
  done
}

Запуск возвращает дату создания:

:~$ echo 'print("hello world")' > blah.py
:~$ xstat "blah.py"
Mon Jul  6 13:43:39 2015    blah.py
:~$ echo 'print("goodbye world")' > blah.py
:~$ xstat "blah.py"
Mon Jul  6 13:43:39 2015    blah.py

Поэтому, если файловая система не поддерживает его, тогда это невозможно, если файловая система делает это, вы можете запустить debugfs с помощью подпроцесса и проанализировать вывод.

Ответ 6

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

См. http://lwn.net/Articles/397442/

Если кто-то пытается использовать команду "stat" для ее получения: % stat -c% w {файл или каталог}

Результат будет "-" из-за того, что у него нет возможности его получить. Тем не менее, можно использовать этот метод выборки, используя debugfs с xstat для его получения (при условии, что используемая файловая система поддерживает его сбор.)

https://gist.github.com/moiseevigor/8c496f632137605b322e

xstat() {
  for target in "${@}"; do
    inode=$(ls -di "${target}" | cut -d ' ' -f 1)
    fs=$(df "${target}"  | tail -1 | awk '{print $1}')
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*')
    printf "%s\t%s\n" "${crtime}" "${target}"
  done
}

Обратите внимание, что для этого требуется sudo.

Ответ 7

Что вы имеете в виду, что это не может быть сделано [1]? Функция

os.stat(path).st_birthtime
прекрасно работает.
[1]:
Somebody said that it couldnt be done
      But he with a chuckle replied
That "maybe it couldnt," but he would be one
      Who wouldnt say so till hed tried.
So he buckled right in with the trace of a grin
      On his face. If he worried he hid it.
He started to sing as he tackled the thing
      That couldnt be done, and he did it!
-- Edgar Albert Guest