Comment trouver des liens symboliques circulaires?

12

Je travaille sur un système HP-UX et je veux savoir s'il existe des liens symboliques circulaires.

Jusqu'à présent, j'utilise la commande:

ls -lrt  `find ./ -follow -type l`

Mais cela ne fait que ls -lrt sur le répertoire courant.

Quelle commande dois-je utiliser pour trouver tous les liens symboliques circulaires dans un système?

Vladimir
la source
1) Vous obtenez le répertoire actuel parce que la findcommande est en train d'imprimer .ou de ne rien imprimer (donc vous exécutez simplement ls -lrtou ls -lrt .) Vous ne savez pas assez sur HP-UX findpour vous dire comment résoudre ce problème (peut-être que cela nécessite une explicite -print? ). 2) Que voulez-vous dire par «circulaire»? ./a -> ./bet ./b -> ./a? Et alors /home/foo/a -> /home? Ou /home/foo/a -> /home/baret /home/bar/b -> /home/foo?
DerfK
Par circulaire, je voulais dire tout type de lien qui peut créer une boucle, donc tout ce qui précède. J'essaie avec -print en ce moment.
Vladimir
Aussi, pourquoi l'inclusion -followne me donne- t-elle pas réellement de vrais liens?
Vladimir
Sans -follow, findexamine le lien lui-même, pas le fichier vers lequel il pointe. find . -type lImprime donc les choses qui sont des liens (parce qu'elles le sont -type l) sans même chercher à voir vers quoi elles pointent (qui seraient des fichiers ou des répertoires ou d'autres liens pointant vers des fichiers ou des répertoires).
DerfK

Réponses:

18

La page de manuel de GNU find indique que toutes les trouvailles POSIX sont censées détecter les boucles du système de fichiers et émettre des messages d'erreur dans ces cas, et j'ai testé

find . -follow -printf ""

sur GNU find, qui a pu trouver des boucles du formulaire ./a -> ./bet ./b -> ./aimprimer l'erreur

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(cela a également fonctionné a->b->c->a)

De même, les boucles du formulaire ./foo/x -> ..et ./foo/a -> ./bar+ ont ./bar/b -> ./fooimprimé les erreurs

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

Si vous vouliez faire quelque chose avec la sortie autre que la lire, vous auriez besoin de la rediriger de stderr vers stdout et de la diriger vers un script qui peut analyser les messages d'erreur.

DerfK
la source
Est-ce à dire que s'il y avait des boucles, un message d'erreur apparaîtrait?
Vladimir
Avec GNU find et -follow, oui.
DerfK
D'accord, mais comment cela explique-t-il l'obtention d'un lslien au lieu d'obtenir des liens réels lorsque vous ne l'utilisez pas -follow?
Vladimir
1
Voilà comment fonctionne le shell. Vous lui avez demandé d'exécuter la lscommande en utilisant la sortie de votre findcommande. Votre findcommande n'a rien imprimé, donc votre shell s'est exécuté lssans rien, qui répertorie le répertoire courant.
DerfK
La solution de DerfK trouve également des cycles dans Windows 7 en l'invoquant à partir d'un shell cygwin.
Don Gateley