Je suggère fortement de ne pas utiliser find -L
cette tâche (voir l'explication ci-dessous). Voici d'autres moyens de le faire:
Si vous voulez utiliser une find
méthode "pure ", elle devrait plutôt ressembler à ceci:
find . -xtype l
( xtype
est un test effectué sur un lien déréférencé) Il peut ne pas être disponible dans toutes les versions de find
. Mais il y a aussi d'autres options:
Vous pouvez également exécuter test -e
depuis la find
commande:
find . -type l ! -exec test -e {} \; -print
Même certains grep
trucs pourraient être meilleurs (c'est-à-dire plus sûrs ) que find -L
, mais pas exactement tels que présentés dans la question (qui grimpe dans des lignes de sortie entières, y compris les noms de fichiers):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
L' find -L
astuce citée par solo de commandlinefu a l' air sympa et hacky, mais elle comporte un piège très dangereux : tous les liens symboliques sont suivis. Considérons un répertoire avec le contenu présenté ci-dessous:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Si vous courez find -L . -type l
dans ce répertoire, tous /usr/share/
seront également recherchés (et cela peut prendre très longtemps) 1 . Pour une find
commande "insensible aux liens sortants", n'utilisez pas-L
.
1 Cela peut sembler être un inconvénient mineur (la commande mettra "juste" longtemps à tout parcourir /usr/share
) - mais peut avoir des conséquences plus graves. Par exemple, considérons les environnements chroot: ils peuvent exister dans certains sous-répertoires du système de fichiers principal et contenir des liens symboliques vers des emplacements absolus. Ces liens peuvent sembler rompus pour le système "extérieur", car ils ne désignent que les lieux appropriés une fois que vous êtes entré dans le chroot. Je rappelle également que certains chargeurs de démarrage utilisaient des liens symboliques sous /boot
cela qui n’avait de sens que dans une phase de démarrage initiale, lorsque la partition de démarrage était montée en tant que /
.
Donc, si vous utilisez une find -L
commande pour rechercher puis supprimer des liens symboliques rompus dans un répertoire inoffensif, vous risquez même de casser votre système ...
rozcietrzewiacz
la source
-type l
est redondant puisque-xtype l
fonctionnera comme-type l
sur des non-liens. Donc,find -xtype l
c'est probablement tout ce dont vous avez besoin. Merci pour cette approche./proc/XXX/exe
lien est cassé. Pour cela, utiliseztest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
signifie "trouver tous les liens symboliques dont les fichiers cibles (ultimes) sont des liens symboliques". Mais la cible ultime d'un lien symbolique ne peut pas être un lien symbolique, sinon nous pouvons toujours suivre le lien et ce n'est pas la cible ultime. Comme il n’existe pas de lien symbolique, nous pouvons les définir comme autre chose, c’est-à-dire des liens symboliques rompus.l
, m'embrouille moins.-L
hack, mais plutôt à la suppression (à l’aveugle) de liens symboliques brisés en général.La
symlinks
commande de http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz peut être utilisée pour identifier des liens symboliques présentant diverses caractéristiques. Par exemple:la source
symlinks
est pré-installé sur Fedora.Comme l'a déjà commenté rozcietrzewiacz, le fait
find -L
d'étendre la recherche à des annuaires liés par des liens symboliques peut avoir des conséquences inattendues. L'approche optimale n'est donc pas optimale. Ce que personne n'a encore mentionné, c'est queest la commande la plus concise et logiquement identique à
Aucune des solutions présentées jusqu'à présent ne détectera de liens symboliques cycliques, ce qui constitue un autre type de rupture. cette question concerne la portabilité. Pour résumer, le moyen portable de trouver des liens symboliques brisés, y compris des liens cycliques, est:
Pour plus de détails, voir cette question ou ynform.org . Bien entendu, la source définitive de tout cela est la documentaton findutils .
la source
find -L
piège ainsi que les liens cycliques. +1-xtype
n'est pas spécifié dans POSIX et bien si vous regardezfind(1)
dans macOS, c'est le cas-type
mais pas-xtype
.Je pense que l'ajout du
-L
drapeau à votre commande vous permettra de vous débarrasser du grep:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
de l'homme:
la source
Si vous avez besoin d'un comportement différent, que le lien soit rompu ou cyclique, vous pouvez également utiliser% Y avec find:
Cet exemple est copié de ce message (site supprimé) .
Référence
la source
find
commande ne prend pas en chargextype
peut être dérivé de ceci:find . type l -printf "%Y %p\n" | grep -w '^N'
. Comme Andy m'a battu avec la même idée (de base) dans son script, j'étais réticent à l'écrire en tant que réponse séparée. :)J'utilise ceci pour mon cas et cela fonctionne assez bien, car je connais le répertoire pour rechercher les liens symboliques brisés:
et mon dossier contient un lien vers
/usr/share
mais il ne le traverse pas. Les liens entre périphériques et ceux qui sont valables pour les chroots, etc. constituent toujours un piège, mais dans mon cas d'utilisation, cela suffit.la source
Une réponse simple, qui est une variation de la version de OP. Parfois, vous voulez juste quelque chose de facile à taper ou à retenir:
la source
find -L . -type l |xargs symlinks
vous indiquera si le lien existe ou non par fichier trouvé.la source
Cela affichera les noms des liens symboliques rompus dans le répertoire actuel.
Fonctionne à Bash. Je ne sais pas pour les autres coquilles.
la source