web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier s'il existe des liens symboliques pointant vers un répertoire?

J'ai un dossier sur mon serveur vers lequel j'avais un certain nombre de liens symboliques pointant. J'ai depuis créé un nouveau dossier et je souhaite modifier tous ces liens symboliques pour pointer vers le nouveau dossier. J'avais envisagé de remplacer le dossier d'origine par un lien symbolique vers le nouveau dossier, mais il semble que si je continuais avec cette pratique, cela pourrait devenir très compliqué très rapidement.

Ce que j'ai fait, c'est de modifier manuellement les liens symboliques pour pointer vers le nouveau dossier, mais j'en ai peut-être manqué quelques-uns.

Existe-t-il un moyen de vérifier s'il existe des liens symboliques pointant vers un dossier particulier?

60
nickf

J'utiliserais la commande find.

find . -lname /particular/folder

Cela recherchera récursivement dans le répertoire courant des liens symboliques vers /particular/folder. Notez qu'il ne trouvera que des liens symboliques absolus. Une commande similaire peut être utilisée pour rechercher tous les liens symboliques pointant vers des objets appelés "dossier":

find . -lname '*folder'

De là, vous devrez éliminer tous les faux positifs.

77
skymt

Vous pouvez auditer les liens symboliques avec le programme symlinks écrit par Mark Lord - il analysera un système de fichiers complet, normalisera les chemins des liens symboliques sous forme absolue et les imprimera sur stdout.

7
JJK

Il n'y a pas vraiment de moyen direct de vérifier ces liens symboliques. Considérez que vous pourriez avoir un système de fichiers qui n'est pas monté tout le temps (par exemple, un lecteur USB externe), qui pourrait contenir des liens symboliques vers un autre volume du système.

Vous pourriez faire quelque chose avec:

for a in `find / -type l`; do echo "$a -> `readlink $a`"; done | grep destfolder

Je note que find de FreeBSD ne prend pas en charge le -lname option, c'est pourquoi je me suis retrouvé avec ce qui précède.

5
Greg Hewgill
find . -type l -printf '%p -> %l\n'
3
no1uknow

À part regarder tous les autres dossiers s'il y a des liens pointant vers le dossier d'origine, je ne pense pas que ce soit possible. Si c'est le cas, je serais intéressé.

2
stephanea
find / -lname 'fullyqualifiedpathoffile'
1
bfabry

Pour les liens physiques, vous pouvez obtenir l'inode de votre répertoire avec l'une des options "ls" (-i, Je pense).

Puis un find avec -inum localisera tous les liens physiques courants.

Pour les liens logiciels, vous devrez peut-être faire un ls -l sur tous les fichiers recherchant le texte après "->" et le normalisant pour s'assurer qu'il s'agit d'un chemin absolu.

1
paxdiablo
find /foldername -type l -exec ls -lad {} \;
1
Lunar Mushrooms