web-dev-qa-db-fra.com

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

J'essaie de trouver tous les liens symboliques dans une arborescence de répertoires pour mon site Web. Je sais que je peux utiliser find pour le faire, mais je ne vois pas 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/www est un lien symbolique. J'ai donc modifié la commande en:

find -L /var/www/ -type l

ça prend du temps à courir, mais je n'ai pas de match.

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

215
hafichuk

Cela va parcourir récursivement le répertoire /path/to/folder et ne lister que les liens symboliques:

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

Si vous souhaitez également suivre les liens symboliques, vous devez utiliser votre commande find, mais vous devez inclure l'option -L. En fait, la page de manuel find 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.

Alors essayez ceci:

find -L /var/www/ -type l

Cela fonctionnera probablement: j'ai trouvé dans la page de manuel find ce diamant: si vous utilisez l'option -type, vous devez le remplacer par l'option -xtype:

          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
267
ztank1013

Une commande, pas de tuyaux

find . -type l -ls

Explication: find à partir du répertoire en cours ., toutes les références de -type link et list -ls ceux en détail. Clair et simple ...

En développant cette réponse, voici quelques commandes plus liées au lien symbolique find:

Rechercher des liens symboliques vers une cible spécifique

find . -lname link_target

Notez que link_target est un motif pouvant contenir des caractères génériques.

Trouver des liens symboliques brisés

find -L . -type l -ls

L'option -L demande à find de suivre les liens symboliques, sauf en cas de rupture.

Rechercher et remplacer les liens symboliques brisés

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

Plus trouver des exemples

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

191
Serge Stroobandt

find ressemble déjà de manière récursive 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]$ 
9
jman

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

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

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

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

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

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

les sorties ressemblent à peu près à 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...
4
siliconrockstar

Ce que je fais est de 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

Il suffit de les chmod + x et vous êtes prêt à partir.

0
Alex M