[RESOLU] Vérifier la validité de liens symbolique en shell

Bonjour à tous,

je vous expose mon problème.

Je dispose d’un répertoire qui a terme contiendra plusieurs dizaine de lien symbolique vers différents éléments de différents partitions. Je souhaiterai pouvoir au travers d’un script shell regarder quel est le fichier pointé et s’il existe.

Mon principale problème est d’abord de regarder quel est le fichier visé:

(server)-<user>-(/home/group/user/test) >>> ls -l
total 0
lrwxrwxrwx   1 user group          46 Jul 21 18:24 fichier 1.txt -> /home/group/user/files/fichier 1.txt
lrwxrwxrwx   1 user group          46 Jul 21 18:24 fichier 2.txt -> /home/group/user/files/fichier 2.txt
lrwxrwxrwx   1 user group          26 Jul 21 18:41 fichier 3.txt -> unFichierQuiNExistePas.txt
lrwxrwxrwx   1 user group          46 Jul 22 14:45 fichier 4.txt -> /home/group/user/files/fichier 4.txt
lrwxrwxrwx   1 user group          46 Jul 22 14:45 fichier 5.txt -> /home/group/user/files/fichier 5.txt
lrwxrwxrwx   1 user group          46 Jul 22 14:45 fichier 6.txt -> /home/group/user/files/fichier 6.txt
(server)-<user>-(/home/group/user/test) >>>

Je souhaiterai pouvoir récupérer juste la dernière colonne, de façon à faire un bête [ -e ${f} ] dans mon script après.

Tout ce que j’ai trouvé sur le net, c’est un truc avec awk qui donne quelque chose comme ça :

Effectivement ça donne bien ce que j’attends, mais serait-il possible d’avoir plutot une commande pour sélectionner la dernière colonne? Ou alors y’a-t-il un truc tout bête qui m’a échappé pour vérifier la validité d’un lien?

Merci de vos réponses.

quote="hasable"
serait-il possible d’avoir plutot une commande pour sélectionner la dernière colonne?
(…)[/quote]awk est spécifiquement fait pour ça.

[quote=“mattotop”]quote="hasable"
serait-il possible d’avoir plutot une commande pour sélectionner la dernière colonne?
(…)[/quote]awk est spécifiquement fait pour ça.[/quote]

A la réflexion, non. Dans la commande que j’ai indiqué, awk affiche la 12ème colonne, ce qui au passage ne correspond pas à ce que je veux.
(et pour afficher la dernière colonne, c’est {print $NF}, je l’ai trouvé depuis).

Le hic, c’est que s’il y’a des espaces dans les noms de fichier, c’est interprété comme 2 colonnes différentes.

Ce que je veux en fait, c’est récupérer le chemin du fichier vers lequel pointe le lien.
Une idée?

Bonjour,
Avec la commande file tu as un aperçu de l’état de ton lien

$ touch fichier
$ ln -s fichier lien
$ file lien
lien: symbolic link to `fichier'
$ rm fichier
$ file lien
lien: broken symbolic link to `fichier'

si tu veux juste tester l’existence du fichier pointé :

Enfin pour avoir le juste le nom du fichier pointé… je sais pas trop…

hope it helps

Ben quand on sait, c’est tout de suite plus simple…

Merki!

Moi je resterai avec awk en lui donnant comme séparateur ‘->’ qui t’assure que $2 sera le chemin du fichier pointé. Non ?

[quote=“thorgrim”]
Moi je resterai avec awk en lui donnant comme séparateur ‘->’ qui t’assure que $2 sera le chemin du fichier pointé. Non ?[/quote]

sauf si le fichier pointé contient -> dans son nom… ui je sais c’est un peu tordu quand même… :confused:

On a le droit d’avoir ça dans un nom de fichier ? Il me semble pas, mais je peux me tromper :slightly_smiling:

Hum …

(server)-<user>-(/home/group/user/test/MVE) >>> touch fichier-\>test.txt
(server)-<user>-(/home/group/user/test/MVE) >>> ls
fichier 1.txt      fichier 3.txt      fichier 5.txt      fichier-           test.txt
fichier 2.txt      fichier 4.txt      fichier 6.txt      fichier->test.txt
(server)-<user>-(/home/group/user/test/MVE) >>>

On peut, on peut…

Pas familier de awk : quelqu’un peut m’indiquer comment on spécifie le séparateur?

L’option -F (fais man awk pour plus d’info).

Sed ça rox :

ll testlink | sed -e 's/^.* -> \(.*\)$/\1/' ../test
Oui ça foire sur si tu as un lien qui s’appelle “toto ->”. Mais j’ai pas bien foutu la regexp tu peut l’améliorer.

Édition :
Un peu lourd dans la forme mais ça marche à tout les fichiers (quoique si tu met un ’ ou un ` ça foire aussi) :

On dit pas “lourd” dans ce cas là, on dit “violent”.
(je sais : les puristes me diront "mais non! c’est rien ça!)

Je vais voir ce que donne vos solutions et jeter un coup d’œil dans les manuels pour voir ce qui m’arrange le mieux.

Merci.

Edit: je vais surement me contenter de mettre " -> " comme séparateur dans awk. C’est possible le mettre dans le nom de fichier, mais faut admettre que c’est qd même pas courant!!! Charge aux utilisateurs de ne pas faire n’importe quoi non plus.

[quote=“hasable”]On dit pas “lourd” dans ce cas là, on dit “violent”.
(je sais : les puristes me diront "mais non! c’est rien ça!)

Je vais voir ce que donne vos solutions et jeter un coup d’œil dans les manuels pour voir ce qui m’arrange le mieux.

Merci.

Edit: je vais surement me contenter de mettre " -> " comme séparateur dans awk. C’est possible le mettre dans le nom de fichier, mais faut admettre que c’est qd même pas courant!!! Charge aux utilisateurs de ne pas faire n’importe quoi non plus.[/quote]
Suffit de tester si le tout premier caractère de la ligne est un “l” quand tu fais un “ls” :wink:

[quote=“tntprog”]
Suffit de tester si le tout premier caractère de la ligne est un “l” quand tu fais un “ls” :wink:[/quote]

non. Ca me dira juste que le fichier est un lien, mais pas vers quoi il pointe.

Sinon, il y avait ceci:

On a le droit d’avoir ça dans un nom de fichier ? Il me semble pas, mais je peux me tromper :slightly_smiling:[/quote]roc@roc:~/tmp$ touch "test->truc" roc@roc:~/tmp$ ll total 0 -rw-r--r-- 1 roc roc 0 jui 24 12:08 test->truc roc@roc:~/tmp$ ln -s truc test roc@roc:~/tmp$ ll total 0 lrwxrwxrwx 1 roc roc 4 jui 24 12:08 test -> truc -rw-r--r-- 1 roc roc 0 jui 24 12:08 test->truc roc@roc:~/tmp$ touch "test -> truc" roc@roc:~/tmp$ ll total 0 lrwxrwxrwx 1 roc roc 4 jui 24 12:08 test -> truc -rw-r--r-- 1 roc roc 0 jui 24 12:09 test -> truc -rw-r--r-- 1 roc roc 0 jui 24 12:08 test->truc On peut, mais c’est confusionnant tout de même. :smt005

Trouvez le lien :

poste02 liens # ls -l total 0 -rw-r--r-- 1 root root 0 jui 24 12:30 ............. lrwxrwxrwx 1 root root 12 jui 24 12:34 truc -> test -> test -> truc

[quote=“hasable”][quote=“tntprog”]
Suffit de tester si le tout premier caractère de la ligne est un “l” quand tu fais un “ls” :wink:[/quote]

non. Ca me dira juste que le fichier est un lien, mais pas vers quoi il pointe.[/quote]
En associant à ce que tu avais fais précédemment, si.

[quote=“pascal50”]Trouvez le lien :

poste02 liens # ls -l total 0 -rw-r--r-- 1 root root 0 jui 24 12:30 ............. lrwxrwxrwx 1 root root 12 jui 24 12:34 truc -> test -> test -> truc [/quote]
Là par contre… :confused:

[quote=“ripat”]Sinon, il y avait ceci:

find /ton/repertoire/ -type l -exec [ ! -e {} ] \; -print[/quote]Ca, ça me parait raisonnable, comme approche.

Tester l’existence d’un lien symbolique c’est tester l’existence de sa cible ? Pas mal.