Wie kann ich symbolische Links eines Dateisystems in einem Perl-Hash darstellen?

8

Bei Serverfehler Wie symbolische Linkketten aufgelistet werden? (nicht meine Frage) spricht darüber, alle symbolischen Links aufzulisten und ihnen zu folgen. Um dies möglich zu machen, betrachten wir zuerst ein einzelnes Verzeichnis.

Ich möchte ein kurzes Programm schreiben, das das tut. Es scheint einfach zu sein, Paare aus symbolischen Links in einen Hash zu setzen und dann den Hash zu verarbeiten.

Aber dann könnte ich etwas wie:

haben %Vor%

wo es offensichtlich ist, dass a->b->c eine Schleife ist und diese Falle in eine Schleife zeigt, aber um x Punkte in einer Schleife zu kennen, muss ich ein bisschen folgen.

Eine Hash-Darstellung ist:

%Vor%

Aber die umgekehrte Darstellung ist besser, um Schleifen zu schlechten Startpunkten zu machen, sobald ich weiß, was die Schleifen sind.

Hier sind einige Fragen:

  • Ist ein Hash die beste Struktur, um symbolische Links darzustellen?
  • Was ist der beste Weg, um das Diagramm des Dateisystems zu trennen, um die loopy-Komponenten von den Baumkomponenten zum Zweig mit einem Loop-Typ Stücke zu teilen?
  • Gibt es einen besseren Algorithmus als manuell nach allen Schleifen von allen Startpunkten zu suchen?
  • Aus einer graphentheoretischen Perspektive - ist diese Art von Dingen schon im CPAN ? Wenn nicht, was sind gute Hilfsmodule?
Paul 23.02.2010, 17:29
quelle

3 Antworten

7

Es gibt ein Diagramm -Modul in CPAN, das Sie wie folgt verwenden könnten:

%Vor%

Beispiel: In einem Verzeichnis, das der Struktur in Ihrer Frage ähnelt, ist die Ausgabe

%Vor%     
Greg Bacon 23.02.2010, 18:39
quelle
2

Sehen Sie sich das CPAN-Modul File :: Spec :: Link an. Die resolve-Methode besagt, dass sie wiederholt eine Verknüpfung durchläuft, um das verknüpfte Ziel zu finden.

Die resolve Methode des Moduls sagt folgendes:

  

auflösen ($ link)
  Gibt die Nicht-Verknüpfung zurück, die letztendlich mit $ link verknüpft ist, indem wiederholt Linked aufgerufen wird. Gibt undef zurück, wenn der Link nicht aufgelöst werden kann.

Ich hatte dieses Modul benutzt, um ein Ziel der symbolischen Verbindung zu finden, dessen Ziel wiederum ein Symlink war und so weiter. Aber ich bin mir nicht sicher, ob dies die zyklischen symbolischen Links erkennt.

    
sateesh 23.02.2010 17:46
quelle
-1

Sie müssen mehr als nur den Namen des Links speichern. Nehmen Sie entweder die Inode-Nummer (wenn Ihr FS dies unterstützt) oder einen anderen einzigartigen Aspekt. Wenn es eines nicht gibt, dann überlegen Sie sich Ihr eigenes zu erstellen, vielleicht indem Sie den Namen / create / last-modified Datum checksummieren. In jedem Fall benötigen Sie eine Möglichkeit, um jeden Link eindeutig zu identifizieren. Ich habe einige Utilities gesehen, die die Anzahl der Links (zwischen 8 und 255) begrenzen und alles, was diese Grenze überschreitet, als Schleife deklarieren, aber ich habe das immer als "den billigen Ausweg" betrachtet. :)

    
TMN 23.02.2010 20:07
quelle