Ma compréhension de base d'un lien symbolique est un fichier spécial, un fichier contenant un chemin de chaîne vers un autre fichier. VFS du noyau fait abstraction de cela, mais y a-t-il une raison pour laquelle les liens symboliques semblent impossibles à modifier?
En d'autres termes: Puis-je éditer un lien symbolique? Si non pourquoi pas
Je comprends qu’il existe différentes manières de remplacer les liens symboliques (deux variantes se trouvent actuellement dans la section des réponses), mais il serait intéressant de savoir pourquoi le remplacement semble être le seul moyen de traiter les liens symboliques. Pourquoi ne pouvez-vous pas simplement changer où ils pointent?
Réponses:
Etant donné qu’un
-f
remplacement silencieux est possible, vous pouvez effectuer un remplacement atomique avecmv -T
(-T le fait fonctionner même si /loc.../link est un répertoire) :linkname
est accessible tout au long du processus.la source
linkname
n'est pas un lien symbolique vers un répertoire. Utilisez l'-T
option surmv
si vous êtes sur GNU ou-h
sur FreeBSD pour éviter cela. Notez queln -sf
cela ne conserve pas les autorisations du lien (sur les systèmes où elles sont importantes).-n
options , par exemple:ln -sfn DESTINATION_DIRECTORY LINK_NAME
. En savoir plus sur askubuntu.com/a/186227/69004Si par édition, vous voulez changer le fichier vers lequel il pointe, alors oui vous pouvez:
Le
-f
paramètre (--force
), lorsqu'il est passé à ln, provoque l'appel de l'unlink()
appel système juste avantsymlink()
Tiré de la réponse de débordement de pile suivante .
la source
test
la cible n'est pas un répertoire. Sinonln -s -f .profile test
, créerait un.profile
lien symbolique dans ce répertoire. GNUln
a une-T
option pour éviter cela.Les liens symboliques doivent être modifiés de manière atomique. Si vous les écrivez à mi-chemin, ils ne fonctionneront pas. Le contenu d'un lien symbolique est assez petit (au plus 4095 caractères sous Linux: la longueur maximale d'un chemin d'accès à un fichier), il serait donc inutile de modifier une partie d'un lien symbolique au niveau du noyau. Par conséquent, le noyau n'offre aucune interface pour éditer un lien symbolique, seulement une interface pour en créer un nouveau, l'
symlink
appel système (plus l'interface génériqueunlink
pour supprimer tout fichier).L'
symlink
appel système crée uniquement un nouveau lien symbolique, il ne supprime aucun fichier existant. Ceci est gênant, mais cohérent avec les autres appels système pour créer des fichiers tels queopen
(qui peut créer un nouveau fichier ou tronquer un fichier existant, mais ne pas remplacer un fichier existant par un fichier nouvellement créé) etmkdir
.Comme vous l'avez découvert dans le shell, vous ne pouvez pas remplacer un lien symbolique de manière atomique par la
ln
commande (ln -sf
dissociez le fichier précédent puis créez le lien symbolique), vous pouvez le faire en créant d'abord un lien symbolique sous un nom temporaire, puis puis le mettre en place.la source
mv -f
(commeln -sf
) ne fera pas ce que vous voulez si$link
pointe vers un répertoire. GNU ln et mv en ont un-T
pour ça.mv
(renommer l'appel système) changera toujours l'inode de$link
tandis queln -sfT
(unlink + symlink) pourrait réutiliser le même.Techniquement, il n'y a pas de commande intégrée pour éditer un lien symbolique existant. Il peut être facilement réalisé avec quelques commandes courtes.
Voici une petite fonction bash / zsh que j'ai écrite pour mettre à jour un lien symbolique existant:
la source
Supposons que linkname existe après avoir effectué (par le passé):
Ensuite, il y a trois façons de changer le lien symbolique:
Utilisez ln avec
-f
force et même pour les répertoires-n
(inode pourrait être réutilisé):Supprimez le lien symbolique et créez-en un nouveau (même pour les répertoires):
créer un nouveau lien symbolique, puis
mv
il (changement atomique même pour les répertoires):la source