gpt4 book ai didi

python - 如何从 Python 更改符号链接(symbolic link)的 atime 和 mtime?

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:05 24 4
gpt4 key购买 nike

我有一个 Python 2.7 程序,它必须创建一个具有过去修改日期的符号链接(symbolic link)。我可以使用 os.symlink() 创建链接,并且 os.utime() 声称可以设置文件的访问时间和修改时间,但是当我使用 os.utime() 在我新创建的符号链接(symbolic link)上,它更改符号链接(symbolic link)指向的文件的 atime 和 mtime,而不是符号链接(symbolic link)的 atime 和 mtime。

从 Python 代码设置符号链接(symbolic link)的访问时间和修改时间的最佳方法是什么?

这是一个演示我在做什么的测试程序:

#!/usr/bin/env python2.7
import os, datetime, time

if __name__ == '__main__':
path1, path2 = 'source', 'link'
if os.path.exists(path1):
os.rmdir(path1)
os.mkdir(path1)
if os.path.lexists(path2):
os.remove(path2)
os.symlink(path1, 'link')

lstat1, lstat2 = os.lstat(path1), os.lstat(path2)
print("Before: {path1} atime {sa}, mtime {sm}, {path2} atime {la}, mtime {lm}".format(
path1=path1, path2=path2, sa=lstat1.st_atime, sm=lstat1.st_mtime,
la=lstat2.st_atime, lm=lstat2.st_mtime))

long_ago = datetime.datetime(datetime.date.today().year - 1,1,1,00,00,00)
long_ago_posix = time.mktime(long_ago.timetuple())
print("Desired: {path1} unchanged, {path2} atime {m}, mtime {m}".format(
path1=path1, path2=path2, m=long_ago_posix))

os.utime(path2, (long_ago_posix, long_ago_posix))

lstat1, lstat2 = os.lstat(path1), os.lstat(path2)
print("After: {path1} atime {sa}, mtime {sm}, {path2} atime {la}, mtime {lm}".format(
path1=path1, path2=path2, sa=lstat1.st_atime, sm=lstat1.st_mtime,
la=lstat2.st_atime, lm=lstat2.st_mtime))

这是我看到的不当行为。 “After:”时间对于“源”而不是对于“链接”会发生变化,但应该发生相反的情况:

% ../src/utime_symlink_test.py
Before: source atime 1514931280.0, mtime 1514931280.0, link atime 1514931280.0, mtime 1514931280.0
Desired: source unchanged, link atime 1483257600.0, mtime 1483257600.0
After: source atime 1483257600.0, mtime 1483257600.0, link atime 1514931280.0, mtime 1514931280.0
% ls -ldT source link
lrwxr-xr-x 1 myuser staff 6 2 Jan 14:14:40 2018 link -> source
drwxr-xr-x 2 myuser staff 68 1 Jan 00:00:00 2017 source

相比之下,touch -h 根据需要更改符号链接(symbolic link)的 atime 和 mtime。

% touch -h -t 201701010000 link
% ls -ldT source link
lrwxr-xr-x 1 myuser staff 6 1 Jan 00:00:00 2017 link -> source
drwxr-xr-x 2 myuser staff 68 1 Jan 00:00:00 2017 source

也许从 Python 执行 touch -h 是我最好的选择,但我希望有更好的选择。

最佳答案

升级到 Python 3.6 并使用 follow_symlinks 选项。

os.utime(path2, (long_ago_posix, long_ago_posix), follow_symlinks = False)

关于python - 如何从 Python 更改符号链接(symbolic link)的 atime 和 mtime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48068739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com