Gibt es eine Möglichkeit, Softlink-Schleifen zu erkennen und zu vermeiden, sie zu kopieren?Copytree mit Schleife in Softlinks
Ich habe ein Verzeichnis, das den Softlink für sich selbst enthält. und ich möchte den Ordner rekursiv kopieren (einschließlich der Metadaten für alle weichen Links) außer dem, der die Schleife erstellt. Gibt es irgendeinen Weg dazu?
Dies ist die Struktur des Regisseurs
makedir testdir
echo "hello world" > removeme.txt
cd testdir
ln TOPDIR ../testdir -s
ln -s ../removeme.txt slnk
so das Verzeichnis wäre:
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
dies ist die Python:
from os.path import realpath
import shutil
shutil.copytree(realpath('testdir'),'removeme_softlink')
Er kopiert den Ordner, in sich selbst rekursiv bis es eine Ausnahme auslöst. Der Fehler würde:
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: ....
Verwenden [ 'os.path.realpath()'] (https://docs.python.org/2/library/os.path.html#os.path.realpath) Ihre Links und Check auszupacken gegen den tatsächlichen Pfad. – zwer
funktioniert nicht. Ich habe die Frage so bearbeitet, dass es das Problem deutlicher zeigt .. danke – Mehrdad