2017-12-06 2 views
0

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: .... 
+1

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

+0

funktioniert nicht. Ich habe die Frage so bearbeitet, dass es das Problem deutlicher zeigt .. danke – Mehrdad

Antwort

0

Durch die Verwendung von realpath()from docs:

Rückkehr des kanonischen Pfades des angegebenen Dateinamen, keine symbolischen Links Beseitigung auf dem Weg begegnet

EDIT :

Ich habe etwas mehr Forschung gemacht und es scheint, dass dies nicht lösbar sein könnte. Alles in allem Dateien sind nur Sequenzen von Bytes auf Ihrer Festplatte und was macht diese Bytes sinnvoll ist Ihr Betriebssystem. Insbesondere symbolische Links sind Dateien mit sehr willkürlichen Zeichenfolgen, die nicht einmal Pfade zu bestehenden Dateien sein müssen! Bei der Verwendung von Methoden wie read()open() in Ihrer Sprachschicht ist es Ihr Betriebssystem, das Eingabe-/Ausgabevorgänge für Dateien verarbeitet. Wenn es nicht damit umgehen kann, wird wahrscheinlich nichts und Sie müssen einige Workarounds wie überprüfen, ob Ihr symbolischer Link auf sich selbst zeigt. Ich empfehle this discussion:

einen Symlink erstellen, die den Namen der aktuellen Datei enthält eine Verwendung haben. Ich weiß es nicht. Aber es gibt keinen Inhalts-Scan der Inhalte der Symlink-Datei. Fast sicher jemand irgendwo ist mit einem solchen Wert als eine Art Flagge. Wenn Sie versuchen, einen solchen Symlink zu öffnen, wird der Kernel sich selbst zurückleiten und eine Schleife erzeugen, die die konfigurierte Schleifenanzahl überschreitet und erkannt wird.

+0

funktioniert nicht. Ich habe die Frage so bearbeitet, dass das Problem klarer dargestellt wird. – Mehrdad

+0

Ich habe mehr Forschung betrieben und meine Antwort aktualisiert. – gonczor