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?
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
find . -type l -ls
Explication: find
à partir du répertoire en cours .
, toutes les références de -type l
ink 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
:
find . -lname link_target
Notez que link_target
est un motif pouvant contenir des caractères génériques.
find -L . -type l -ls
L'option -L
demande à find
de suivre les liens symboliques, sauf en cas de rupture.
find -L . -type l -delete -exec ln -s new_target {} \;
Plus d'exemples _ find
peuvent être trouvés ici: https://hamwaves.com/find/
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]$
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 {} \;
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...
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.