2008-09-19 9 views
50

Ich habe einen Ordner auf meinem Server, auf den ich eine Reihe symbolischer Links zeigte. Ich habe seitdem einen neuen Ordner erstellt und möchte alle symbolischen Links so ändern, dass sie auf den neuen Ordner zeigen. Ich hatte darüber nachgedacht, den ursprünglichen Ordner durch einen Symlink zu ersetzen, aber es scheint, dass wenn ich mit dieser Übung fortfahren würde, es sehr schnell sehr unordentlich werden könnte.Gibt es eine Möglichkeit zu überprüfen, ob es symbolische Links gibt, die auf ein Verzeichnis verweisen?

Was ich getan habe, ist manuell die Symlinks zu ändern, um auf den neuen Ordner zu zeigen, aber ich habe vielleicht ein paar verpasst.

Gibt es eine Möglichkeit zu überprüfen, ob es symbolische Verbindungen gibt, die auf einen bestimmten Ordner verweisen?

Antwort

63

Ich würde den Befehl find verwenden.

find . -lname /particular/folder 

die rekursiv das aktuelle Verzeichnis für Symlinks zu /particular/folder suchen. Beachten Sie, dass nur absolute symbolische Links gefunden werden. Ein ähnlicher Befehl kann verwendet werden für alle Symlinks suchen auf Objekte zeigen „Ordner“ genannt:

find . -lname '*folder' 

Von dort würden Sie Fehlalarme aussortieren müssen.

+4

danke, das hat gut funktioniert. Für alle anderen, die das ausprobieren: Die Verwendung des Schalters -maxdepth hat wirklich dazu beigetragen, die Suche zu beschleunigen, da ich wusste, in welcher Tiefe die Links wären. – nickf

+1

Wow, genau das habe ich gesucht. Danke skymt für die Antwort und @nickf für das Stellen der Frage :) – icasimpan

+1

Danke. Seien Sie vorsichtig, dass das Vorhandensein eines Schrägstrichs in der Verknüpfung das Ergebnis ändern kann. Also brauchst du vielleicht einen 'Fund. -lname '* Ordner?' " – regilero

1
find/-lname 'fullyqualifiedpathoffile' 
1

Für harte Links können Sie die Inode Ihres Verzeichnisses mit einem der „ls“ Optionen erhalten (-i, glaube ich).

Dann wird ein find mit -inum alle gemeinsamen Hardlinks finden.

Für Softlinks müssen Sie möglicherweise einen ls -l auf allen Dateien nach dem Text nach "->" suchen und normalisieren, um sicherzustellen, dass es sich um einen absoluten Pfad handelt.

+0

Dies würde gut funktionieren, um alle Hardlinks zu einer Datei zu finden. Aber Hardlinks zu einem Verzeichnis sind ein großes No-No. Der Dateisystemtreiber lässt dich nicht so etwas erstellen, und wenn du masochistisch genug bist, die rohe Partition manuell zu bearbeiten und zu bearbeiten, macht das viele Dinge sehr unglücklich. – Thomee

+0

Ich empfehle keine festen Links zu Ordnern, aber TimeMachine auf OS X verwendet sie. E.G: http://belkadan.com/blog/2011/07/rm-vs-Time-Machine/ –

5

Es gibt keine direkte Möglichkeit, nach solchen symbolischen Links zu suchen. Bedenken Sie, dass Sie möglicherweise ein Dateisystem haben, das nicht ständig geladen ist (z. B. ein externes USB-Laufwerk), das symbolische Links zu einem anderen Volume auf dem System enthalten könnte.

Sie könnten etwas mit tun:

for a in `find/-type l`; do echo "$a -> `readlink $a`"; done | grep destfolder 

Ich nehme zur Kenntnis, dass FreeBSD find ist nicht die -lname Option nicht unterstützt, weshalb ich mit dem oben gelandet.

2

Abgesehen von den anderen Ordnern, wenn Links auf den ursprünglichen Ordner verweisen, glaube ich nicht, dass es möglich ist. Wenn es so ist, wäre ich interessiert.

3
find . -type l -printf '%p -> %l\n' 
6

Sie können mit the symlinks program von Mark Herrn geschrieben Symlinks prüfen - es wird ein gesamtes Dateisystem scannen, Symlink-Pfade in absolute Form normalisieren und sie auf die Standardausgabe drucken.

1
find /foldername -type l -exec ls -lad {} \; 
+0

Dies funktioniert gut auf dem Mac. Vielen Dank. Einige bösartige Symlinks auf einer Website gefunden, die mit einem Wordpress-Hack erstellt wurden. Ja wirklich. Vielen Dank. – Vik

Verwandte Themen