web-dev-qa-db-fra.com

Supprimer un lien symbolique vers un répertoire

J'ai un lien symbolique vers un répertoire important. Je veux me débarrasser de ce lien symbolique tout en gardant le répertoire derrière lui.

J'ai essayé rm et obtenir rm: cannot remove 'foo'.
J'ai essayé rmdir et je suis revenu rmdir: failed to remove 'foo': Directory not empty
J'ai ensuite progressé dans rm -f, rm -rf et Sudo rm -rf

Ensuite, je suis allé chercher mes sauvegardes.

Y a-t-il un moyen de se débarrasser du lien symbolique sans jeter le bébé avec l'eau du bain?

1046
Matthew Scouten
# this works
rm foo
# versus
rm foo/

En gros, vous devez lui dire de supprimer un fichier, pas de supprimer un répertoire. Je crois que la différence entre rm et rmdir existe en raison des différences dans la façon dont la bibliothèque C traite chacune d'elles.

Quoi qu'il en soit, le premier devrait fonctionner, tandis que le second devrait se plaindre du fait que foo soit un répertoire.

Si cela ne fonctionne pas comme ci-dessus, vérifiez vos autorisations. Vous devez disposer d'une autorisation en écriture sur le répertoire contenant pour supprimer des fichiers.

1268
Matthew Scharley

utilisez la commande "unlink" et assurez-vous pas d'avoir le/à la fin

$ unlink mySymLink

unlink () supprime un nom du système de fichiers. Si ce nom était le dernier lien vers un fichier et qu'aucun processus ne l'a ouvert, le fichier est supprimé et l'espace utilisé était mis à disposition pour être réutilisé. Si le nom était le dernier lien vers un fichier mais que le processus reste ouvert pour tous les processus, le fichier restera en place jusqu'à la fermeture du dernier descripteur de fichier le concernant.

Je pense que cela peut être problématique si je le lis correctement.

Si le nom fait référence à un lien symbolique, le lien est supprimé.

Si le nom fait référence à un socket, un fifo ou un périphérique, son nom est supprimé, mais les processus dont l'objet est ouvert peuvent continuer à l'utiliser.

https://linux.die.net/man/2/unlink

825
Joe Phillips

rm devrait supprimer le lien symbolique.

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 
17
Steve K

Utilisez rm symlinkname mais n'incluez pas de barre oblique à la fin (n'utilisez pas: rm symlinkname/). On vous demandera ensuite si vous souhaitez supprimer le lien symbolique, y, pour répondre oui.

15
DeeEss09

En supposant qu'il s'agisse d'un lien symbolique,

$ rm -d symlink

Cela devrait se comprendre, mais comme cela ne peut pas être activé, le code latent qui était destiné à un autre cas qui n'existe plus mais qui arrive à faire la bonne chose ici.

12
Joshua

Si rm ne peut pas supprimer un lien symbolique, vous devrez peut-être consulter les autorisations du répertoire contenant le lien symbolique. Pour supprimer des entrées de répertoire, vous devez disposer d'une autorisation d'écriture sur le répertoire contenant.

7
Greg Hewgill

En supposant que votre configuration ressemble à quelque chose comme: ln -s /mnt/bar ~/foo, vous devriez alors pouvoir faire un rm foo sans problème. Si vous ne le pouvez pas, assurez-vous d’être le propriétaire du foo et d’avoir le droit d’écrire/exécuter le fichier. Supprimer foo ne touchera pas bar, sauf si vous le faites de manière récursive.

4
tj111

J'ai eu ce problème avec MinGW (en fait, Git Bash) s'exécutant sur un serveur Windows. Aucune des suggestions ci-dessus n'a semblé fonctionner. En fin de compte, une copie du répertoire a été créée au cas où vous avez ensuite supprimé le lien symbolique dans l'Explorateur Windows, puis supprimé l'élément dans la corbeille. Cela faisait des bruits de suppression de fichiers, mais pas du tout. Faites une sauvegarde cependant!

2
Keith Whittingham

Sur CentOS, lancez simplement rm linkname et il vous demandera de "supprimer le lien symbolique?". Type Y et Enter, le lien aura disparu et le répertoire sera en sécurité.

2
Yuri