Comment trouver tous les liens symboliques dans une arborescence de répertoires?

255

J'essaie de trouver tous les liens symboliques dans une arborescence de répertoires pour mon site Web. Je sais que je peux utiliser findpour cela, mais je ne peux pas comprendre comment vérifier récursivement les répertoires.

J'ai essayé cette commande:

find /var/www/ -type l

… Et plus tard, j'ai découvert que le contenu de /var/wwwsont des liens symboliques, j'ai donc changé la commande en:

find -L /var/www/ -type l

cela prend un certain temps à courir, mais je n'obtiens aucun match.

Comment puis-je obtenir cela pour vérifier les sous-répertoires?

hafichuk
la source

Réponses:

301

Cela parcourra récursivement le /path/to/folderrépertoire et ne listera que les liens symboliques:

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

Si votre intention est de suivre également les liens symboliques, vous devez utiliser votre findcommande mais vous devez inclure l' -Loption; en fait, la findpage de manuel dit:

   -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.

Essayez ensuite ceci:

find -L /var/www/ -type l

Cela fonctionnera probablement: j'ai trouvé dans la findpage de manuel ce diamant: si vous utilisez l' -typeoption, vous devez la changer en -xtypeoption:

          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.

Ensuite:

find -L /var/www/ -xtype l
ztank1013
la source
1
Merci, cela fonctionnerait probablement, mais j'ai juste remarqué que le contenu de / var / www / est déjà des liens symboliques et cela ne semble pas se reproduire dans ces répertoires.
hafichuk
4
@hafichuk voir l'édition finale dans ma réponse ( find -L /var/www/ -xtype l). Utiliser -xtypeau lieu de -typedevrait faire l'affaire dans votre recherche. Bonne chance!
ztank1013
3
Faites cela ls -laR /path/to/folder | grep ^lsi vous voulez également traiter les dossiers de points "cachés" ...
wimvds
2
Je vous remercie! Mais cela ne montre que le nom des liens mais pas leur emplacement.
Kostanos
8
sous Mac OSX (10.9), -xtypen'est pas disponible. find . -type lsemble vérifier récursivement.
amertkara
227

Une commande, pas de tuyaux

find . -type l -ls

Explication: à find partir du répertoire actuel ., toutes les références d' -type lencre et répertoriez- -lsles en détail. Clair et simple ...

En développant cette réponse, voici quelques findcommandes liées aux liens symboliques :

Rechercher des liens symboliques vers une cible spécifique

find . -lname link_target

Notez que link_targetc'est un modèle qui peut contenir des caractères génériques.

Trouvez des liens symboliques brisés

find -L . -type l -ls

L' -Loption indique findde suivre les liens symboliques, sauf en cas de rupture.

Rechercher et remplacer les liens symboliques rompus

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

Plus d'exemples de recherche

Plus d' findexemples peuvent être trouvés ici: https://hamwaves.com/find/

Serge Stroobandt
la source
7
Si vous cherchez à être plus succinct, il peut être utile de mentionner que la plupart des versions findont une -lsoption. Cela find . -type l -lsdevrait donc être l'équivalent de ce qui précède.
Bratchley
7
Cela améliore la réponse acceptée, car il vous indique également où se trouvent les liens symboliques dans l'arborescence des répertoires, particulièrement important lorsque vous travaillez avec le type d'arbre complexe et profond, car il est susceptible d'avoir des liens symboliques.
Jesse Crossen
2
Mieux vaut que la question soit acceptée comme une meilleure réponse.
Lord_Dracon
3
Cette réponse est beaucoup plus utile que la réponse acceptée. En outre, si vous voulez trouver des liens symboliques qui pointent vers des fichiers dans un répertoire: find -lname '*/dir/*' -printf '%P -> %l\n'. Il convient de mentionner que link_target est un modèle.
x-yuri
1
C'est mon type de réponse. Clair et simple. Merci.
truthadjustr
11

find regarde déjà récursivement par défaut:

[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
la source
C'est probablement l'un de ces pièges, tous les fichiers dans / var / www sont des liens symboliques. Est-ce que les findrécursions par défaut? Je suppose que non;)
hafichuk
Ya, probablement pour éviter de boucler.
jman
J'ai mis à jour pour utiliser le -Ldrapeau pour trouver sans aucune chance - des suppositions?
hafichuk
Solution parfaite, et elle montre l'emplacement des liens. Je vous remercie!
Kostanos
8

Pour voir uniquement les liens symboliques eux-mêmes, vous pouvez utiliser

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

alors que si vous voulez voir aussi quels fichiers ils ciblent, ajoutez simplement un ls

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

C'est la meilleure chose que j'ai trouvée jusqu'à présent - vous montre les liens symboliques dans le répertoire actuel, récursivement, mais sans les suivre, affichés avec des chemins d'accès complets et d'autres informations:

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

les sorties ressemblent à ceci:

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
la source
0

Ce que je fais, c'est créer un script dans mon répertoire bin qui ressemble à un alias. Par exemple, j'ai un script nommé lsd ls -l | grep ^ d

vous pourriez en faire un lsl ls -lR | grep ^ l

Chmod juste + x et vous êtes prêt à partir.

Alex M
la source