问题描述
我创建了一个 Python 脚本来帮助管理 unRAID 服务器上的媒体。新文件会自动传输到文件夹中,脚本使用文件夹结构和文件名来确定它们应该移动到的位置,通常是移动到同一驱动器上的另一个共享中。使用 Midnight Commander,这种转移会立即发生。资源管理器中的这个过程或我的脚本使用 shutil.move() 复制文件然后删除原始文件,这对于大文件可能需要很长时间,并且还会在驱动器上创建不必要的读/写。当传输在同一共享上时,它在 Explorer 和 Python 中都是即时的。
简化伪代码 - 在此示例中,Transfer 和 TV 共享在同一磁盘上:
from shutil import move
oldpath = r'\\NAS\Transfer\incoming\test.mkv'
newPath = r'\\NAS\TV\test.mkv'
move(oldpath,newPath)
有没有办法用 Python 移动文件的指针,就像我假设 MC 正在做的那样,而不是物理移动文件?
解决方法
为文件赋予新名称同时将其保留在同一文件系统上的底层接口是 os.rename()
。如果该调用失败,将无法进行就地重命名。
如果您测试过可以直接在文件服务器上进行有效的本地重命名,但不能通过网络共享,则您可能忽略了网络文件系统的限制(或它的配置方式;使确保从客户端的角度来看,源和目标都在同一个挂载点下,而不仅仅是服务器的。