copytree与软链接中的循环

时间:2017-12-06 20:59:17

标签: python

有没有办法检测软链接循环并省略复制它们?

我有一个包含自己的软链接的目录。我想递归复制文件夹(包括所有软链接的元数据),除了创建循环的人。有没有办法这样做?

这是导演的结构

makedir testdir
echo "hello world" > removeme.txt 
cd testdir
ln TOPDIR ../testdir -s
ln -s ../removeme.txt slnk 

所以目录是:

ls test_dir/ -l 
total 64
lrwxrwxrwx 1 root root 15 Dec  7 09:31 slnk -> ../removeme.txt
lrwxrwxrwx 1 root root 11 Dec  6 12:46 TOPDIR -> ../test_dir

这是python:

from os.path import realpath
import shutil
shutil.copytree(realpath('testdir'),'removeme_softlink')

它递归地将文件夹复制到自身,直到它引发异常。错误是:

Traceback (most recent call last):
  File "./m.py", line 10, in <module>
   shutil.copytree(realpath(fileName),'removeme_softlink');
  File "/usr/lib64/python2.6/shutil.py", line 173, in copytree
   raise Error, errors
  shutil.Erro:
  /test_dir/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR', 'removeme_softlink/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR/TOPDIR', "
  [Errno 40] Too many levels of symbolic links: ....

1 个答案:

答案 0 :(得分:0)

使用realpath() from docs

  

返回指定文件名的规范路径,消除路径中遇到的任何符号链接

编辑:

我做了更多的研究,看起来这可能无法解决。所有文件都只是磁盘上的字节序列,以及这些字节有意义的是您的操作系统。特别是符号链接是具有非常任意字符序列的文件,甚至不需要是现有文件的路径!在语言层下使用read() open()等方法时,操作系统会处理文件的输入/输出操作。如果它无法处理它,可能没有什么不会,你将不得不做一些变通办法,如检查你的符号链接是否指向自己。我推荐this discussion

  

创建包含当前文件名称的符号链接   一个用途。我不知道。但是没有任何内容扫描   符号链接文件的内容。几乎可以肯定有人在某个地方   使用这样的值作为某种标志。如果你试图打开这样的   符号链接内核将重定向回自身创建一个循环   将超过配置的循环计数并被检测到。