#1 Le 22/06/2017, à 08:17
- Vbuntu
Renommer Hard link/lien symbolique
Bonjour,
J'ai des lien symbolique ln un peu de partout d'un de mes gros fichiers sur le serveur, et j'aimerai le renommer quelque part et que ça renomme de partout... d'après la doc ubuntu c'est impossible, et d'après "help" de la fonction ln aucune option semble permettre le renommage de partout.
Autre option que j'ai, c'est supprimer tous les liens symboliques que j'ai et les recréer. Mais comment être sûr que le fichier qui s'affiche sur la console est un lien symbolique et non le vrai fichier que je ne veux surtout pas effacer?
Merci
Dernière modification par Vbuntu (Le 22/06/2017, à 08:18)
Hors ligne
#2 Le 22/06/2017, à 09:19
- Bougron
Re : Renommer Hard link/lien symbolique
Bonjour
u16041@u16041:~$ mkdir LIENS
u16041@u16041:~$ cd LIENS
u16041@u16041:~/LIENS$ touch toto
u16041@u16041:~/LIENS$ ln -s -T toto totolnk
u16041@u16041:~/LIENS$ ls -ls
total 0
0 -rw-rw-r-- 1 u16041 u16041 0 juin 22 10:14 toto
0 lrwxrwxrwx 1 u16041 u16041 4 juin 22 10:18 totolnk -> toto
u16041@u16041:~/LIENS$
du coup, il devrait y avoir cette commande permettant de trouver tous les liens
sudo ls -Rls / | grep lrwxrwxrwx
Dernière modification par Bougron (Le 22/06/2017, à 09:30)
Hors ligne
#3 Le 22/06/2017, à 12:39
- Vbuntu
Re : Renommer Hard link/lien symbolique
Merci pour le bout de code. Je l'ai testé mais je crois qu'il ne fait pas ce que je souhaite. Lorsque je modifie le nom du fichier à un endroit ça ne le modifie pas ailleurs.
Quant à la dernière commande elle me liste tous les liens sous cette forme " totolnk -> toto" (donc ceux crées avec les options -s et -T), mais pas ceux créés avec juste "ln" sans option
Hors ligne
#4 Le 22/06/2017, à 14:01
- Sciensous
Re : Renommer Hard link/lien symbolique
pour recherher les liens en durs:
find -samefile <nomdufichier1>
et pour renommer: option -exec du find
voir la man
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#5 Le 22/06/2017, à 14:04
- Bougron
Re : Renommer Hard link/lien symbolique
Si dans la commande ln, tu ne mets pas l'option -s, ce n'est pas un lien symbolique que tu fais mais un lien réel qui enregistre une position physique.
Si tu changes son nom à un endroit, il reste disponible aux autres endroits avec les anciens noms https://doc.ubuntu-fr.org/lien_physique_et_symbolique
Il n'y a donc absolument pas lieu de changer son nom.
Pour retrouver tous les endroits où il est répertorié:
u16041@u16041:~/LIENS$ ls -lis
total 0
1455035 0 -rw-rw-r-- 3 u16041 u16041 0 juin 22 10:14 toto
1455035 0 -rw-rw-r-- 3 u16041 u16041 0 juin 22 10:14 toto1
1455035 0 -rw-rw-r-- 3 u16041 u16041 0 juin 22 10:14 toto2
1455037 0 lrwxrwxrwx 1 u16041 u16041 4 juin 22 10:18 totolnk -> toto
u16041@u16041:~/LIENS$
tu constateras que les trois fichiers toto, toto1 et toto2 sont un seul et même fichier car ils pointent sur le même inode.
Je te propose d'essayer la commande
ls -lis toto
tu obtiendras l'endroit physique de stockage, dans mon contexte 1455035
et tu recherches tous les fichiers pointant à cet endroit.
Je vois cette codif
ls -Rlis * | grep 1455035
Il peut y avoir mieux
u16041@u16041:~$ ls -Rlis | grep toto
1455035 4 -rw-rw-r-- 3 u16041 u16041 5 juin 22 15:10 toto
1455035 4 -rw-rw-r-- 3 u16041 u16041 5 juin 22 15:10 toto2
1455037 0 lrwxrwxrwx 1 u16041 u16041 4 juin 22 10:18 totolnk -> toto
u16041@u16041:~$ ls -Rlis | grep 1455035
1455035 4 -rw-rw-r-- 3 u16041 u16041 5 juin 22 15:10 titi
1455035 4 -rw-rw-r-- 3 u16041 u16041 5 juin 22 15:10 toto
1455035 4 -rw-rw-r-- 3 u16041 u16041 5 juin 22 15:10 toto2
u16041@u16041:~$ find -samefile toto
find: «toto»: Aucun fichier ou dossier de ce type
u16041@u16041:~$
Dernière modification par Bougron (Le 22/06/2017, à 14:31)
Hors ligne
#6 Le 22/06/2017, à 14:30
- DonutMan75
Re : Renommer Hard link/lien symbolique
Hello,
rien ne t'interdit de renommer ton "vrai" fichier puis de faire un lien symbolique nom_ancien_fichier --> nom_nouveau_fichier
Ainsi tu as renommé ton fichier et tout tes liens symboliques fonctionnent.
Sinon, tu peux lister tous les liens qui pointent vers ton "vrai" fichier via l'option -lname de find
$ find . -lname '/chemin/absolu/vers/nom_ancien_fichier'
Cela devrait fonctionner à condition que tout tes liens sont en chemin absolu et non pas en relatif...
Sinon cette commande devrait marcher dans tous les cas (mais elle est moins robuste car elle suppose qu'il n'y a pas d'autre fichier qui s'appelle "nom_ancien_fichier")
$ find . -lname '*nom_ancien_fichier'
Après, je suppose qu'on peut redéfinir les liens à la volée par :
$ find . -lname '*ancien_fichier' - exec ln -sf ./nouveau_fichier {} \;
Ne pas oublier l'option -f de ln qui écrase les anciens liens. Je te recommande de faire une sortie de find dans le exec avant pour contrôler que tu n'écrases pas des trucs qu'il ne faudrait pas !
Exemple :
$ mkdir testln
$ cd testln
$ echo "coucou" > ancien_fichier
$ ln -s ./ancien_fichier lien1
$ ln -s ./ancien_fichier lien2
$ ln -s ./ancien_fichier lien3
$ ll
lrwxr-xr-x 1 xxx yyy 16 22 jui 15:24 lien1 -> ./ancien_fichier
lrwxr-xr-x 1 xxx yyy 16 22 jui 15:24 lien2 -> ./ancien_fichier
lrwxr-xr-x 1 xxx yyy 16 22 jui 15:24 lien3 -> ./ancien_fichier
$ cat lien1
coucou
$ mv ancien_fichier nouveau_fichier
$ cat lien1
cat: lien1: No such file or directory
$ find . -lname '*ancien_fichier' -exec ln -sf ./nouveau_fichier {} \;
$ ll
lrwxr-xr-x 1 xxx yyy 17 22 jui 15:25 lien1 -> ./nouveau_fichier
lrwxr-xr-x 1 xxx yyy 17 22 jui 15:25 lien2 -> ./nouveau_fichier
lrwxr-xr-x 1 xxx yyy 17 22 jui 15:25 lien3 -> ./nouveau_fichier
$ cat lien1
coucou
Ouep, ça marche bien
EDIT : ambiguité dans la question, le titre parle de liens physiques (hard link) et le message de liens symboliques. Ca n'a rien à voir. Si on a un seul fichier existant sont différents hard link alors modifier le nom de l'un n'impactera pas les autres.... Pour savoir sous combien de liens physique différent existe ton fichier, il faut faire un ll et regarder la première valeur juste avant le user :
lrwxr-xr-x 1 xxx yyy 17 22 jui 15:25 lien1 -> ./nouveau_fichier
A bientôt,
Donut
Dernière modification par DonutMan75 (Le 22/06/2017, à 14:38)
Hors ligne
#7 Le 22/06/2017, à 15:37
- Vbuntu
Re : Renommer Hard link/lien symbolique
@Sciensous
Quoi que je cherche avec cette commande ça me ressort ./nomdufichier, donc ça ne pointe pas vers la direction du fichier d'origine.
@Bougron
Effectivement, ce n'était pas un lien symbolique que je faisais mais un lien normal. Je me suis trompé dans la traduction.
Le Hard link (lien normal) fonctionne toujours si jamais je déplace le fichier source ou si je le supprime. Donc ça me va très bien le hard link, par mesure de précaution il me semble meilleur que le lien symbolique.
j'ai un dossier qui contient totosource.txt et un dossier nommé DOSSIER
dans DOSSIER j'ai fait un ln (hard link) de totosource.txt et j'ai renommé le fichier en totodest.txt
j'ai donc
$ ls
totosource.txt
DOSSIER
$ cd DOSSIER
$ ls
totodest.txt
Lorsque je fais
$ ls -lis totodest.txt
j'ai
61988893 0 -rw-rw-r-- 2 user user 0 22 juin 16:16 totodest.txt
si je fais ensuite
$ ls -Rlis * | grep 61988893
il m’apparaît
61988893 0 -rw-rw-r-- 2 user user 0 22 juin 16:16 totodest.txt
J'ai un peu l'impression de tourner en rond et de ne jamais avoir ni le nom du fichier source ni encore moins le chemin. Le find samefile ne me donne pas non plus ces infos.
@Donut
je n'avais jamais fait attention à ce petit chiffre lorsqu'on fait un ll! Info utile, merci!
Sinon c'est bien des hard link que je veux.
Le fichier d'origine a souvent un nom composé de lettres et de longues séries de chiffres. Immémorisable.
Je fais un hard link vers ailleurs où je traduis ça en nom barbare plein d'infos sur mon fichier.
Et j'en fais ensuite d'autres à droite et à gauche avec des noms très simplifiés. Ce que je pensais être une méthode de simplification, avec es noms bien mémorisable pour savoir sur quoi on travaille, c'est petit à petit transformé en gros truc complexe avec plein de fichiers identiques mais nommés différemment ce qui parfois porte à confusion. C'est pour ça que j'aimerai renommer tous mes hard links qui sort répartis de partout de la même manière.
Merci à tous
Hors ligne
#8 Le 23/06/2017, à 07:47
- Vbuntu
Re : Renommer Hard link/lien symbolique
Ah, c'est bon j'ai réussi! Merci!
ls -Rlis | grep 1451812 il faut le faire depuis un dossier le plus proche de la racine, sinon on ne voit pas tous les hard link.
donc ça c'est très bien, je peux voir tous les noms différents de mon même fichier.
Maintenant comment je peux modifier tous les noms en une seule fois, sans les chercher un par un ? Ou au pire comment avoir le chemin d'accès pour totobidule et totodest?
merci
Hors ligne
#9 Le 23/06/2017, à 08:34
- Bougron
Re : Renommer Hard link/lien symbolique
Bonjour
Si tu as des centaines de noms différents pour le même fichier, il te faut un script. Mais je ne suis pas très compétent.
si tu n'en as qu'une dizaine, je pense que cela doit marcher:
mv nomancien NouveauNom
mv anciennom NouveauNom
mv Oldname NouveauNom
mv Le fichierlinké NouveauNom
mv xxxxxxx NouveauNom
Je te rappelle simplement que le changement de nom n'est pas nécessaire.
Je ne connais pas d'option permettant de lister sous la forme
-rwxrwx--- 1 u16041 plugdev 1013K juin 30 2016 /home/u16041/Téléchargements/UM_Acer_1.0_Fr/Acer Regulatory Information and Safety Guide_FR_v5.pdf
Mais ces commandes devraient coller puisque tu connais le inode
cd /
sudo find . -inum 61988893
Dernière modification par Bougron (Le 23/06/2017, à 09:26)
Hors ligne