Получить все 4 метки времени в Python на Btrfs - PullRequest
0 голосов
/ 10 марта 2020

Если я выполняю команду stat для файла в Btrfs, я получаю что-то вроде следующего:

Access: 2020-03-10 14:52:58.095399291 +1100
Modify: 2020-02-21 02:36:29.595148361 +1100
Change: 2020-02-21 17:20:59.692104719 +1100
 Birth: 2020-02-20 17:59:44.372828264 +1100

Как мне получить 4 раза в Python?

Я пытался сделать os.stat(), однако времени рождения там не существует. Я нашел crtime в прошлых ответах, но для этого требуется sudo, а stat - нет.

Я мог бы самостоятельно разобрать stat результаты, но в идеале есть кое-что, что уже существует.

1 Ответ

0 голосов
/ 10 марта 2020

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

import datetime
import re
import subprocess

def stat_ns(path):
    '''
    Python doesn't support nanoseconds yet, so just return the total # of nanoseconds.
    '''
    # Use human-readable formats to include nanoseconds
    outputs = subprocess.check_output(['stat', '--format=%x\n%y\n%z\n%w', path]).decode().strip().split('\n')
    res = {}
    for name, cur_output in zip(('access', 'modify', 'change', 'birth'), outputs):
        # Remove the ns part and process it ourselves, as Python doesn't support it
        start, mid, end = re.match(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\.(\d{9}) ([+-]\d{4})', cur_output).groups()
        seconds = int(datetime.datetime.strptime(f'{start} {end}', '%Y-%m-%d %H:%M:%S %z').timestamp())
        ns = 10**9 * seconds + int(mid)
        res[name] = ns
    return res

Пример вывода функции выглядит следующим образом:

{'access': 1583824344829877823,
 'modify': 1583824346649884067,
 'change': 1583824346649884067,
 'birth': 1583813803975447216}
...