Wie kann ich erkennen, dass ein Symlink in Perl unterbrochen ist?

8

Ich möchte einen beschädigten Symlink in einem Verzeichnis mit Perl entfernen.

In meinen Gedanken musste ich nur die Datei eines Verzeichnisses auflisten und testen, ob das ein Symlink (-l) ist und wenn es false zurückgibt, einfach die Verknüpfung aufheben.

Aber wenn ich readir benutze, um alle Dateien aufzulisten, werden meine fehlerhaften symbolischen Links nicht als Datei reorganisiert. Da mein Link auf nichts zeigt, verstehe ich warum.

Dann : Wie kann ich erkennen, ob ein Symlink in Perl unterbrochen ist?

Danke,

AKTUALISIEREN

Alle Dateien in $ myDir sind symbolische Links, entweder gültig oder fehlerhaft. Wenn ich @files anzeige, erhalte ich nur eine Liste von gültigen Symlinks.

%Vor%     
Spredzy 05.07.2011, 09:46
quelle

6 Antworten

8

Es gibt zwei wichtige relevante Systemaufrufe: stat() und lstat() . Der Aufruf lstat() sagt Ihnen, dass es sich um einen Symlink handelt (bei anderen Dateien verhält er sich jedoch genauso wie stat() ). Dadurch können Sie feststellen, dass der Name ein Symlink ist. Der Systemaufruf stat() folgt einem Symlink bis zum Ende und teilt Ihnen die Datei (oder das Verzeichnis) am Ende des Links mit. Wenn der Aufruf stat() auf dem Symlink fehlschlägt, ist der Symlink unterbrochen oder Sie versuchen, auf ein Verzeichnis oder eine Datei zuzugreifen, für die Sie keine Berechtigung haben.

Die Perl Dateitest -Operatoren enthalten -l , um festzustellen, ob ein Name ein Symlink ist. Sie können die Perl-Funktionen stat und lstat explizit. Dazwischen sollten Sie in der Lage sein, herauszufinden, ob ein Symlink kaputt ist oder nicht - aber Sie sollten wahrscheinlich planen, eine Funktion zu schreiben, um den Job zu erledigen.

Sie müssen wahrscheinlich die readlink Perl-Funktion nicht verwenden. Achten Sie auf das zugrunde liegende System readlink() Aufruf; es gibt keine nullterminierte Zeichenfolge zurück!

Es ist interessant, dass weder Perl noch sein POSIX-Modul die Funktion realpath() unterstützt. Das Modul PathTools unterstützt dies jedoch. Wenn realpath fehlschlägt, ist der Symlink in einem Symlink nicht funktionsfähig (aka broken).

    
Jonathan Leffler 05.07.2011, 10:01
quelle
6

Kombinieren von lstat mit stat :

%Vor%

update : es funktioniert für mich ...

%Vor%     
salva 05.07.2011 10:03
quelle
4

Hier ist ein Code, den ich benutzt habe, um kaputte Links zu entfernen:

%Vor%

Beachten Sie, dass es wichtig ist, dass das Verzeichnis mit den Links das aktuelle Verzeichnis ist. readdir gibt nur Dateinamen zurück und die Links können relativ sein.

    
cjm 05.07.2011 10:00
quelle
3

Auf defekte symbolische Links prüfen (nur die oberste Ebene prüfen, wenn es symbolische Links zu symbolischen Links gibt):

%Vor%     
ysth 05.07.2011 10:00
quelle
2

Verwenden Sie readlink() und stat() das Ergebnis.

    
Peder Klingenberg 05.07.2011 10:00
quelle
1

Mit der integrierten Perl-Glob-Funktion? Für Beispiele:

%Vor%

Für eine bestimmte $dir :

%Vor%     
Mazangaz 27.12.2011 13:20
quelle

Tags und Links