Supprimer un lien symbolique vers un répertoire


1085

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é de rmrevenir rm: cannot remove 'foo'.
J'ai essayé rmdiret je suis revenu , rmdir: failed to remove 'foo': Directory not empty
je puis progressais à travers rm -f, rm -rfetsudo rm -rf

Ensuite, je suis allé chercher mes sauvegardes.

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


74
quel est le problème avec poser des questions liées à linux? la dernière fois que j'ai vérifié, le débordement de la pile n'était pas spécifique au système d'
exploitation

6
Cette question ne serait-elle pas mieux adaptée au super utilisateur ou à un échange de pile lié à Linux?
mwfearnley

45
@mwfearnley Ce serait, mais vérifiez la date. Le super utilisateur n'était pas encore une chose à l'époque. Il a été porté, il est donc là aussi. Je ne sais pas pourquoi il est toujours là, mais c'est ma question la plus élevée et je ne vais pas regarder le karma cadeau dans la bouche.
Matthew Scouten

16
CONSEIL: rm -r link/ supprime le contenu sur la cible
Gayan Weerakutti

31
Then I went to find my back-ups- Cela m'a fait rire.
frakman1

Réponses:


1309
# this works:
rm foo
# versus this, which doesn't:
rm foo/

Fondamentalement, vous devez lui dire de supprimer un fichier , pas de supprimer un répertoire . Je crois que la différence entre rmet rmdirexiste en raison des différences dans la façon dont la bibliothèque C traite chacune.

En tout cas, 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.


122
Ah oui. ça a du sens. Je n'ai jamais tapé foo, j'ai tapé f <tab> et bash a rempli a / pour moi.
Matthew Scouten

6
Cela ne fonctionne pas toujours. Parfois, vous devez exécuter rm -rf folderName(sans suivi /) pour supprimer le lien symbolique. Amazon Linux se comporte de cette manière dans certaines circonstances, par exemple.
brandonscript

18
@ r3mus: ne jamais utiliser -ravec un lien symbolique sauf si vous voulez tout perdre à l'intérieur. -fne devrait pas non plus être nécessaire, sauf peut-être pour remplacer les autorisations de fichier.
Matthew Scharley

27
Plus précisément, unlinkn'a aucun lien avec l' lnopération de «liaison» AKA. Le nom unlinkfait référence au processus de dissociation / suppression d'un fichier de la table de fichiers du système de fichiers afin que le contenu se détache de toute référence à eux - ils sont dissociés. C'est un nom déroutant qui est carrément trompeur lorsqu'il est appliqué aux liens et aux liens symboliques en particulier. unlinkfonctionnera avec les liens symboliques car il fonctionne avec n'importe quel fichier, quel que soit son type.
Matthew Scharley

4
Si vous êtes réellement inquiet de faire quelque chose de stupide, cela alias rm="rm -i"a sauvé plus de peaux que n'importe quoi d'autre, je pense.
Matthew Scharley

832

utilisez la commande "unlink" et assurez-vous de ne pas 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 n'a ouvert le fichier, le fichier est supprimé et l'espace qu'il utilisait est rendu disponible pour être réutilisé. Si le nom était le dernier lien vers un fichier mais que tous les processus ont toujours le fichier ouvert, le fichier restera en vigueur jusqu'à la fermeture du dernier descripteur de fichier s'y référant.

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 qui ont l'objet ouvert peuvent continuer à l'utiliser.

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


33
@OmarAbid La version "rm foo /" me fait peur. Celui-ci semble beaucoup plus sûr :)
Joe Phillips

9
Dans Ubuntu, je l' ai testé avec ~/c/a/file, /c/b/avec ln -s ~/c/a ~/c/b/. Dans ~/c/b/, rm a/ne fonctionne pas, rm -rf a/ne vide que l'original a. unlink afonctionne parfaitement et unlink a/ne fait rien.
Brady Trainor

3
Dans OS X 10.10, unlinkest simplement un alias pour rm. Va montrer que la rmdiscipline appropriée doit être utilisée lorsque vous traitez avec n'importe quelle partie de votre structure de répertoire.
Doug Powers

1
Dans les scripts, rm -fil supprimera silencieusement un lien, qu'il existe ou non, alors qu'il unlinkse plaindra si le lien n'est pas présent. Il n'y a pas d'option `-f 'équivalente pour délier, rend le script plus complexe.
shonky linux user

22
unlinkpeut supprimer des fichiers normaux. son moins fonctionnel que rmet non spécifique aux liens symboliques. rmne supprime pas non plus les répertoires sans l' -rindicateur. Je recommande donc de préférer rm, il a des drapeaux pour verbeux et interactif; ainsi que des messages d'avertissement et d'erreur significatifs.
ThorSummoner

18

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

Utilisez rm symlinknamemais n'incluez pas de barre oblique à la fin (n'utilisez pas:) rm symlinkname/. Il vous sera alors demandé si vous souhaitez supprimer le lien symbolique, ypour répondre oui.


63
Vous ne vous trompez pas, mais la bonne réponse est déjà là et acceptée (il y a 4 ans!). Pourquoi s'embêter?
Matthew Scouten

1
Google a eu cela comme extrait en vedette lors de la recherche de "Supprimer un lien symbolique". Peut-être qu'il a aimé sa brièveté, pas sûr de savoir comment fonctionne son heuristique. Quoi qu'il en soit, j'ai rapidement fait un facepalm quand j'ai regardé ma ligne de commande :-)
Randall

12

En supposant qu'il s'agit en fait d'un lien symbolique,

$ rm -d symlink

Il devrait le comprendre, mais comme il ne peut pas, nous pouvons activer le code latent qui était destiné à un autre cas qui n'existe plus mais qui fait la bonne chose ici.


7

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


4

En supposant que votre configuration est quelque chose comme:, ln -s /mnt/bar ~/fooalors vous devriez pouvoir faire rm foosans problème. Si vous ne le pouvez pas, assurez-vous que vous en êtes le propriétaire fooet que vous êtes autorisé à écrire / exécuter le fichier. La suppression foone touchera pas bar, sauf si vous le faites récursivement.


2

Sur CentOS, lancez-le rm linknameet il vous demandera de "supprimer le lien symbolique?". Tapez Yet Enter, le lien aura disparu et le répertoire sera sûr.


2

J'ai eu ce problème avec MinGW (en fait Git Bash) fonctionnant sur un serveur Windows. Aucune des suggestions ci-dessus ne semble fonctionner. En fin de compte, une copie du répertoire a été faite au cas où puis supprimé le lien logiciel dans l'Explorateur Windows, puis supprimé l'élément dans la corbeille. Il a fait du bruit comme s'il supprimait les fichiers mais ne l'a pas fait. Faites une sauvegarde cependant!


3
"Cela faisait du bruit comme s'il supprimait des fichiers ..." - Wow!
Sterex

LMFAO. "Cela faisait du bruit comme s'il supprimait des fichiers ..."
Shivam Jha

Je me souviens des disquettes!
Keith Whittingham

Rien de ce qui précède n'a fonctionné pour moi: eddyq @ eddyq-Latitude-E6440: ~ $ ls Téléchargements de bureau Dropbox-Windows Musique Vidéos publiques w Documents Dropbox examples.desktop Pictures Templates 'VmWare vmx files'
eddyq
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.