有没有办法检测软链接循环并省略复制它们?
我有一个包含自己的软链接的目录。我想递归复制文件夹(包括所有软链接的元数据),除了创建循环的人。有没有办法这样做?
这是导演的结构
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: ....
答案 0 :(得分:0)
使用realpath()
from docs:
返回指定文件名的规范路径,消除路径中遇到的任何符号链接
编辑:
我做了更多的研究,看起来这可能无法解决。所有文件都只是磁盘上的字节序列,以及这些字节有意义的是您的操作系统。特别是符号链接是具有非常任意字符序列的文件,甚至不需要是现有文件的路径!在语言层下使用read()
open()
等方法时,操作系统会处理文件的输入/输出操作。如果它无法处理它,可能没有什么不会,你将不得不做一些变通办法,如检查你的符号链接是否指向自己。我推荐this discussion:
创建包含当前文件名称的符号链接 一个用途。我不知道。但是没有任何内容扫描 符号链接文件的内容。几乎可以肯定有人在某个地方 使用这样的值作为某种标志。如果你试图打开这样的 符号链接内核将重定向回自身创建一个循环 将超过配置的循环计数并被检测到。