So finden Sie alle symbolischen Links, die auf eine Datei / ein Verzeichnis in einem bestimmten Verzeichnis verweisen

14

Auf diese Frage oder auf diese Frage (zum Beispiel) erhalten Sie Lösungen, wie Sie nach Symlinks suchen, die auf ein bestimmtes Verzeichnis verweisen (nennen wir es /dir1), während ich mich für symbolische Links interessiere, die möglicherweise auf eine Datei / einen Ordner darin verweisen /dir1.

Ich möchte ein solches Verzeichnis löschen, bin mir aber nicht sicher, ob ich dies sicher tun kann, da ich in einem anderen Verzeichnis (nennen wir es es /dir2) möglicherweise Symlinks habe, die auf innere Teile von verweisen /dir1.

Außerdem habe ich diese Symlinks möglicherweise mit absoluten oder relativen Pfaden erstellt. Meine einzige Hilfe ist, dass ich weiß, dass sich die Symlinks, die ich überprüfen möchte, auf einem bereitgestellten Dateisystem befinden /dir2.

Antonello
quelle

Antworten:

15

Sie finden alle symbolischen Links mit:

find / -type l 

Möglicherweise möchten Sie dies als root ausführen, um an jeden Ort auf der Disc zu gelangen.

Sie können diese mithilfe von erweitern readlink -f, um den vollständigen Pfad des Links abzurufen, und Sie sollten in der Lage sein, grepdie Ausgabe mit dem Zielverzeichnis zu vergleichen, das Sie zum Löschen in Betracht ziehen:

find / -type l -exec readlink -f {} + | grep -F /dir2

Die Verwendung von find / -type l -printf '%l\n'funktioniert nicht, da Sie relative Links erhalten, ../tmp/xyzdie möglicherweise auf Ihr Zielverzeichnis verweisen, jedoch nicht übereinstimmen, da sie nicht vollständig erweitert sind.

Anthon
quelle
1
Im Falle eines Teilbaums kann es nützlich sein, Symlinks zu folgen:find -L /subtree -xtype l -exec readlink -f {} +
ruvim
3

In meinem Fall war die akzeptierte Antwort nicht hilfreich (da die Linkquelle nicht ausgegeben wurde). Hier ist, was für mich gearbeitet hat.

Ich habe es mit zwei -execKlauseln umgangen:

find /home/ -type l -exec readlink -nf {} ';' -exec echo " -> {}" ';' | grep "/dir2"
Dorian Marchal
quelle
1

Mit zsh:

printf '%s\n' /dir2/**/*(D@e'([[ $REPLY:P = /dir1(/*|) ]])')
Stéphane Chazelas
quelle