如果符号链接已经存在,如何覆盖 Python3 中的现有符号链接?
How to override existing symlink in Python3 if symlink already exists?
我有一个工作 bash 脚本创建 and/or 重写当前符号 link到没有任何数据竞争的新路径。如果程序试图找到一条路径,它要么从 symlink 中获取旧路径,要么获取新路径。这是因为 -f 模式 。这是 bash:
中的样子
cd /srv/
ln -nsf /home/myproject/video123.ts latest_video.mkv
ln -nsf /home/myproject/video124.ts latest_video.mkv
ln -nsf /home/myproject/video125.ts latest_video.mkv
在 python3 中有一个名为 os.symlink() 的模块创建了一个 symlink 但它无法实现覆盖行为。
import os, errno
def symlink_force(target, link_name):
try:
os.symlink(target, link_name)
except OSError, e:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise e
正如您在一小部分时间内看到的那样,在调用 os.remove(link_name) 方法时存在停机时间。关于如何在不删除现有符号的情况下进行覆盖的任何想法link?
感谢任何帮助。
查看 ln -nsf 的行为(使用 strace)将显示该命令由 2 个系统调用执行:
- 将 symlink 创建到源文件中,并在目标文件夹中使用临时文件名。
- 正在将临时文件重命名为目标文件
这种方法(优于 remove/symlink)的优点是重命名保证在任何时间点,目标文件将指向旧文件或新文件。
可能 Python 实施(假设可以安全地使用“.new”作为临时 link)
def symlink_force(target, link_name):
try:
temp_link = link_name + ".new"
os.remove(temp_link)
os.symlink(target, temp_link)
os.rename(temp_link, link_name)
except OSError e:
# Handle critical errors
我有一个工作 bash 脚本创建 and/or 重写当前符号 link到没有任何数据竞争的新路径。如果程序试图找到一条路径,它要么从 symlink 中获取旧路径,要么获取新路径。这是因为 -f 模式 。这是 bash:
中的样子cd /srv/
ln -nsf /home/myproject/video123.ts latest_video.mkv
ln -nsf /home/myproject/video124.ts latest_video.mkv
ln -nsf /home/myproject/video125.ts latest_video.mkv
在 python3 中有一个名为 os.symlink() 的模块创建了一个 symlink 但它无法实现覆盖行为。
import os, errno
def symlink_force(target, link_name):
try:
os.symlink(target, link_name)
except OSError, e:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
else:
raise e
正如您在一小部分时间内看到的那样,在调用 os.remove(link_name) 方法时存在停机时间。关于如何在不删除现有符号的情况下进行覆盖的任何想法link?
感谢任何帮助。
查看 ln -nsf 的行为(使用 strace)将显示该命令由 2 个系统调用执行:
- 将 symlink 创建到源文件中,并在目标文件夹中使用临时文件名。
- 正在将临时文件重命名为目标文件
这种方法(优于 remove/symlink)的优点是重命名保证在任何时间点,目标文件将指向旧文件或新文件。
可能 Python 实施(假设可以安全地使用“.new”作为临时 link)
def symlink_force(target, link_name):
try:
temp_link = link_name + ".new"
os.remove(temp_link)
os.symlink(target, temp_link)
os.rename(temp_link, link_name)
except OSError e:
# Handle critical errors