Comment trouver tous les liens logiciels (liens symboliques) dans le répertoire courant?

10

La question concerne l'écriture de scripts shell dans bash.

Comment vérifier avec un script quels fichiers du répertoire courant sont des liens logiciels?

Dans le cas où j'ai utilisé le mauvais terme, quand je dis des liens logiciels, je fais référence aux fichiers créés à l'aide ln -s.

La seule chose à laquelle j'ai réussi à penser est d'évaluer ls -laen tant qu'expression et d'analyser ses résultats, mais ce n'est évidemment pas la meilleure solution.

bguiz
la source
1
Ils sont appelés «liens symboliques» (par opposition aux «liens matériels»).
pause jusqu'à nouvel ordre.
Righto, je savais que je me suis probablement trompé de terme, merci pour l'
avertissement
Le lien souple est très bien aussi, mais avec un espace. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

Réponses:

14

Vous n'avez peut-être pas vraiment besoin d'un script. Pour afficher les liens symboliques dans le dossier en cours uniquement, sans recurseur dans un dossier enfant:

trouver . -maxdepth 1 -type l -print

Ou, pour obtenir plus d'informations, utilisez l'une des méthodes suivantes:

trouver . -maxdepth 1 -type l -exec ls -ld {} +
trouver . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Pour savoir si un fichier est un lien symbolique, on peut utiliser readlink, qui ne sortira rien s'il ne s'agit pas d'un lien symbolique. L'exemple suivant n'est pas très utile, mais montre comment readlinkignore les fichiers et dossiers normaux. Utilisez l'un des:

trouver . -maxdepth 1 -exec readlink {} +
trouver . -maxdepth 1 -print0 | lien de lecture xargs -0

Notez que ce qui précède -exec ... +et xargs ...sont beaucoup plus rapides que -exec ... \;. Comme:

time find / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
réel 0m0.372s
utilisateur 0m0.087s
sys 0m0.163s

heure trouver / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
réel 0m0.013s
utilisateur 0m0.004s
sys 0m0.008s

heure trouver / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
réel 0m0.012s
utilisateur 0m0.004s
sys 0m0.009s
Arjan
la source
J'ai mieux aimé la réponse de Polsy, toujours +1 pour vous, car je pourrais avoir besoin de le faire en dehors d'un script shell un jour.
bguiz
1
Vous n'avez pas nécessairement besoin de xargs. Vous pouvez simplement utiliser find. -maxdepth 1 -exec readlink {} \;
stib
C'est vrai, @stib, mais xargsc'est beaucoup plus rapide sur mon Mac; voir mon montage. Mais j'ai appris quelque chose de nouveau aujourd'hui: il y a aussi +au lieu de \;(même si certains prétendent que cela a / a eu des problèmes avec grep.)
Arjan