在 Btrfs 上获取 Python 中的所有 4 个时间戳
Get all 4 timestamps in Python on Btrfs
如果我对 Btrfs 下的文件执行 stat
命令,我会得到类似于以下输出的内容:
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
如何获得 Python 中的 4 次?
我试过 os.stat()
,但是那里没有出生时间。我在过去的答案中找到 crtime,但这需要 sudo
,而 stat
不需要。
我可以自己解析 stat
结果,但理想情况下已经存在一些东西。
这是我调用 stat
命令并手动解析输出的解决方案。请随意 post 不需要这样做的解决方案。
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}
与其解析 stat
输出,我建议使用 Python/C API to directly interface the stat
source code 就好像它是一个库。
提供一个例子可能会很有趣,但我不会这样做(至少现在),因为我已经很长时间没有玩 Python/C API我目前正忙于其他事情。如果我感到有动力,我可能会挑战自己并稍后更新这个答案。
如果我对 Btrfs 下的文件执行 stat
命令,我会得到类似于以下输出的内容:
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
如何获得 Python 中的 4 次?
我试过 os.stat()
,但是那里没有出生时间。我在过去的答案中找到 crtime,但这需要 sudo
,而 stat
不需要。
我可以自己解析 stat
结果,但理想情况下已经存在一些东西。
这是我调用 stat
命令并手动解析输出的解决方案。请随意 post 不需要这样做的解决方案。
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}
与其解析 stat
输出,我建议使用 Python/C API to directly interface the stat
source code 就好像它是一个库。
提供一个例子可能会很有趣,但我不会这样做(至少现在),因为我已经很长时间没有玩 Python/C API我目前正忙于其他事情。如果我感到有动力,我可能会挑战自己并稍后更新这个答案。