395 Stimmen

Wie kann ich alle Symlinks in einem Verzeichnisbaum finden?

Ich versuche, alle Symlinks innerhalb eines Verzeichnisbaums für meine Website zu finden. Ich weiß, dass ich Folgendes verwenden kann find um dies zu tun, 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 habe ich entdeckt, dass die Inhalte in /var/www sind Symlinks, also habe ich den Befehl geändert in:

find -L /var/www/ -type l

Es dauert eine Weile, bis es läuft, aber ich bekomme keine Treffer.

Wie bringe ich das Programm dazu, Unterverzeichnisse zu prüfen?

418voto

ztank1013 Punkte 6471

Dies führt zu einer rekursiven Durchquerung der /path/to/folder und listen Sie nur die symbolischen Links auf:

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

Wenn Sie die Absicht haben, auch den symbolischen Links zu folgen, sollten Sie Ihre find Befehl, aber Sie sollten die -L Option; in der Tat ist die find sagt die Manpage:

   -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 dies:

find -L /var/www/ -type l

Das wird wahrscheinlich funktionieren: Ich habe in der find man-Seite diesen Diamanten: Wenn Sie den -type müssen Sie die Option in die Option -xtype Option:

          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

402voto

Serge Stroobandt Punkte 23731

Ein Befehl, keine Pipes

find . -type l -ls

Erläuterung: find aus dem aktuellen Verzeichnis . weiter alle Referenzen von -type l Tinte und Liste -ls diese im Detail. Schlicht und einfach...

Ergänzend zu dieser Antwort hier noch ein paar weitere symbolische Links find Befehle:

Symbolische Links zu einem bestimmten Ziel finden

find . -lname link_target

Beachten Sie, dass link_target ist ein Muster, das Platzhalterzeichen enthalten kann.

Fehlerhafte symbolische Links finden

find -L . -type l -ls

Die -L Die Option befiehlt find symbolischen Links zu folgen, es sei denn, sie sind defekt.

Fehlerhafte symbolische Links suchen und ersetzen

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

Weitere Fundbeispiele

Mehr find Beispiele sind hier zu finden: https://hamwaves.com/find/

16voto

jman Punkte 10996

find sucht bereits standardmäßig rekursiv:

[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]$

10voto

MariusPontmercy Punkte 336

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

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

und wenn Sie auch sehen wollen, welche Dateien sie anvisieren, fügen Sie einfach ein ls

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

8voto

siliconrockstar Punkte 3298

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

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

Die Ausgänge 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...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X