liste des fichiers par cible de lien symbolique

23

Comment obtenir la liste des fichiers (puis faire quelque chose avec cette liste) en filtrant le nom cible du lien symbolique et non le nom du lien symbolique? Par exemple, dans la liste suivante, je ne suis intéressé que par les quatre premiers fichiers (la cible contient bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc
Matt Wilkie
la source

Réponses:

31

Vous pouvez utiliser find pour récupérer tous les fichiers de type lien symbolique et ajouter l' -ilnameoption de recherche par nom de la destination du lien. Cela fonctionne exactement comme -inamepour le nom de cible du lien au lieu du nom du lien.

find -type l -ilname "*bar*"

Cela affichera toujours le nom du lien, pas la cible. Si vous souhaitez imprimer les noms des cibles, essayez ceci:

find -type l -ilname "*bar*" -printf "%l\n"

Ou obtenez une lssortie complète

find -type l -ilname "*bar*" -ls

Ce que vous entendez par « faire quelque chose avec la liste » n'est pas clair, mais si vous voulez opérer sur les fichiers de liens, vous pouvez utiliser l' -execargument pour trouver:

find -type l -ilname "*bar*" -exec touch {} \;

Mais si vous devez opérer sur les cibles de lien, vous devrez utiliser le -printfpour obtenir les valeurs cibles et ensuite xargsou une boucle vous-même pour fonctionner. Vous pourriez faire quelque chose comme ça:

find -type l -printf "%l\n" | grep bar | xargs touch

... qui montre également comment utiliser grepau lieu de find -ilnamefaire votre correspondance de nom, bien que vous puissiez le faire de toute façon.

Caleb
la source
merci Caleb! Vous avez complètement répondu à ma question immédiate et couvert certains cas de canaux secondaires que j'utiliserai certainement également.
matt wilkie
1
une idée pourquoi cela ne find /dev/disk/ -type l -ilname "*sde*"fonctionne pas?
Aquarius Power
Nécessite GNU find.
ceving du