Wie finde ich alle Symlinks in einem Verzeichnisbaum?

254

Ich versuche, alle Symlinks in einem Verzeichnisbaum für meine Website zu finden. Ich weiß, dass ich dies verwenden kann find, aber ich kann nicht herausfinden, wie ich die Verzeichnisse rekursiv überprüfen kann.

Ich habe diesen Befehl ausprobiert:

find /var/www/ -type l

… Und später entdeckte ich, dass die Inhalte in /var/wwwSymlinks sind, also habe ich den Befehl geändert in:

find -L /var/www/ -type l

Es dauert eine Weile, bis ich renne, aber ich bekomme keine Übereinstimmungen.

Wie kann ich damit Unterverzeichnisse überprüfen?

Hafichuk
quelle

Antworten:

300

Dadurch wird das /path/to/folderVerzeichnis rekursiv durchlaufen und nur die symbolischen Links aufgelistet:

ls -lR /path/to/folder | grep ^l

Wenn Sie auch den symbolischen Links folgen möchten, sollten Sie Ihren findBefehl verwenden, aber die -LOption einschließen . Tatsächlich heißt es auf der findManpage:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

Dann versuchen Sie Folgendes:

find -L /var/www/ -type l

Dies wird wahrscheinlich funktionieren: Ich habe in der findManpage diesen Diamanten gefunden: Wenn Sie die -typeOption verwenden, müssen Sie sie in die -xtypeOption ändern :

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

Dann:

find -L /var/www/ -xtype l
ztank1013
quelle
1
Vielen Dank, dies würde wahrscheinlich funktionieren, aber ich habe gerade bemerkt, dass der Inhalt von / var / www / bereits Symlinks sind und dies nicht in diese Verzeichnisse zurückzukehren scheint.
Hafichuk
4
@hafichuk siehe endgültige Bearbeitung in meiner Antwort ( find -L /var/www/ -xtype l). Verwenden -xtypeanstelle von -typesollte den Trick in Ihrem Fund tun. Viel Glück!
ztank1013
3
Machen Sie das, ls -laR /path/to/folder | grep ^lwenn Sie auch "versteckte"
Punktordner
2
Danke dir! Dies zeigt jedoch nur den Namen der Links, nicht jedoch deren Position.
Kostanos
8
unter Mac OSX (10.9) -xtypeist nicht verfügbar. find . -type lscheint rekursiv zu prüfen.
Amertkara
227

Ein Befehl, keine Rohre

find . -type l -ls

Erläuterung: find Ab dem aktuellen Verzeichnis .alle -type lTintenreferenzen und -lsdetaillierte Auflistung . Schlicht und einfach...

Um diese Antwort zu erweitern, finden Sie hier einige weitere findBefehle im Zusammenhang mit symbolischen Links :

Finden Sie symbolische Links zu einem bestimmten Ziel

find . -lname link_target

Beachten Sie, dass dies link_targetein Muster ist, das Platzhalterzeichen enthalten kann.

Finde kaputte symbolische Links

find -L . -type l -ls

Die -LOption weist Sie findan, symbolischen Links zu folgen, sofern diese nicht fehlerhaft sind.

Suchen und ersetzen Sie defekte symbolische Links

find -L . -type l -delete -exec ln -s new_target {} \;

Weitere Beispiele finden

Weitere findBeispiele finden Sie hier: https://hamwaves.com/find/

Serge Stroobandt
quelle
7
Wenn Sie prägnanter sein möchten, ist es möglicherweise erwähnenswert, dass die meisten Versionen von findeine -lsOption haben. So find . -type l -lssollte das Äquivalent der oben genannten sein.
Bratchley
7
Dies verbessert die akzeptierte Antwort, da Sie auch erfahren, wo sich die Symlinks im Verzeichnisbaum befinden. Dies ist besonders wichtig, wenn Sie mit einem komplexen und tiefen Baum arbeiten, der wahrscheinlich Symlinks enthält.
Jesse Crossen
2
Besser als die Frage als bessere Antwort akzeptiert.
Lord_Dracon
3
Diese Antwort ist weitaus nützlicher als die akzeptierte. Wenn Sie Symlinks suchen möchten, die auf Dateien in einem Verzeichnis verweisen : find -lname '*/dir/*' -printf '%P -> %l\n'. Erwähnenswert ist, dass link_target ein Muster ist.
X-Yuri
1
Dies ist meine Art der Antwort. Schlicht und einfach. Vielen Dank.
Truthadjustr
11

find sieht standardmäßig schon rekursiv aus:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 
jman
quelle
Dies ist wahrscheinlich eine dieser Fallstricke. Alle Dateien in / var / www sind Symlinks. Ist finddie von Standard - Rekursion? Ich
vermute
Ja, wahrscheinlich um Schleifen zu vermeiden.
Jman
Ich habe aktualisiert, um die -LFlagge für das Finden ohne Glück zu verwenden - irgendwelche Vermutungen?
Hafichuk
Perfekte Lösung, und es zeigt die Position der Links. Danke dir!
Kostanos
8

Um nur die Symlinks selbst zu sehen, können Sie verwenden

find -L /path/to/dir/ -xtype l 

Wenn Sie auch sehen möchten, auf welche Dateien sie abzielen, fügen Sie einfach ein ls hinzu

find -L /path/to/dir/ -xtype l -exec ls -al {} \;
MariusPontmercy
quelle
6

Dies ist das Beste, was ich bisher gefunden habe - zeigt Ihnen die Symlinks im aktuellen Verzeichnis, rekursiv, aber ohne ihnen zu folgen, angezeigt mit vollständigen Pfaden und anderen Informationen:

find ./ -type l -print0 | xargs -0 ls -plah

Die Ausgaben sehen ungefähr so ​​aus:

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...
Siliconrockstar
quelle
0

Ich erstelle ein Skript in meinem bin-Verzeichnis, das einem Alias ​​ähnelt. Zum Beispiel habe ich ein Skript namens lsd ls -l | grep ^ d

Sie könnten eine lsl ls -lR | machen grep ^ l

Chmod sie einfach + x und du bist gut zu gehen.

Alex M.
quelle