python shutil.move : odd softlinking

标签 python linux

我写的一个脚本是为了将单独的日期目录从一个旧位置移动到一个新位置,其结构如下:

/old/YYYY/MM/DD
/new/YYYY/MM/DD

对于另一项任务(与数据移动无关),我在新位置创建了一个软链接(soft link),如下所示(这是我犯的第一个错误):

/new/2011/09 -> /old/2011/09

我的脚本基本使用了这个函数调用:

for d in os.listdir("/old/2011/09"):
    shutil.move(os.path.join("/old/2011/09/", d), os.path.join("/new/2011/09", d))

运行我的脚本后,2011/09 中的两个都是空的。我在处理未存档数据时遇到过这种情况……大问题。 我的问题是为什么 shutil.move() 没有给我一个错误,提示我移动的 day 目录已经存在?由于软链接(soft link),09 中的每一天都应该是相同的目录。 p>

/new/2011/09/01 == /old/2011/09/01

在调用 shutil.copy2 之前,shutil.move 调用不会检查 src 和 dst 吗? 来自文档:“目标目录必须不存在。”还是仅当它使用重命名时?并且如果它有所不同,旧的和新的位置都是 glusterfs。

shutil.move Documentation

shutil.copy Documentation

感谢您提供的任何清晰信息。

编辑/更新:我向 python-list 提交了一个问题,询问为什么存在这种行为并询问是否应该更改它 (list archive)。他们建议我提交错误报告。在进行提交错误的测试时,我发现这已在 Python 2.7 中修复。您可以在移动函数声明中看到源代码中的差异:Python 2.6Python 2.7 .

这仍然会进行移动/重命名,但不会神奇地删除整个目录。

最佳答案

归结为 shutil.move 中的这两行:

        copytree(src, real_dst, symlinks=True)
        rmtree(src)

其中 src='old'real_dst='new/old'copytree 命令将old 复制到子目录new/old。一切顺利,尽管它可能不是您想要的。

rmtree 删除 目录。这是个问题,因为 new 现在是悬空符号链接(symbolic link)。

关于 python shutil.move : odd softlinking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854608/

相关文章:

python - 如何在 PyOpenCL 中覆盖数组元素

python - ConfigObj/ConfigParser 与为 Python 设置文件使用 YAML

python - py.test -- 模拟常量并在测试函数中引发异常

linux - sed - 使用数组构建正则表达式

python - 如果 HDF5 组/表不存在,则创建它

python - 如何使用 PANDAS/Python 将矩阵转换为列数组

linux - 尝试将管道命令放入 if 语句

c++ - 用 C 编译 C++ 代码

linux - 查找目录中的所有 JSON 文件并将其组合在 bash 中的数组中

c++ - 格罗马克 : Illegal instruction (core dumped)