Rimuovere un collegamento simbolico a una directory


1085

Ho un link simbolico a una directory importante. Voglio liberarmi di quel link simbolico, mantenendo la directory dietro di esso.

Ho provato rme torno rm: cannot remove 'foo'.
Ho provato rmdire tornato, rmdir: failed to remove 'foo': Directory not empty
poi ho fatto progressi rm -f, rm -rfesudo rm -rf

Poi sono andato a cercare i miei backup.

C'è un modo per sbarazzarsi del collegamento simbolico senza buttare via il bambino con l'acqua del bagno?


74
Cosa c'è di sbagliato nel porre domande relative a Linux? l'ultima volta che ho controllato, l'overflow dello stack non era specifico del sistema
operativo

6
Questa domanda non sarebbe più adatta a Super User o a uno scambio di stack relativo a Linux?
mwfearnley,

45
@mwfearnley Sarebbe, ma controlla la data. Super User non era ancora una cosa. È stato portato, quindi è anche lì. Non sono sicuro del perché sia ​​ancora qui, ma è la mia domanda con il punteggio più alto e non guarderò il karma regalo in bocca.
Matthew Scouten,

16
SUGGERIMENTO: rm -r link/ elimina il contenuto dell'obiettivo
Gayan Weerakutti,

31
Then I went to find my back-ups- Mi ha fatto ridere.
frakman1,

Risposte:


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

Fondamentalmente, devi dirgli di eliminare un file , non di eliminare una directory . Credo che la differenza tra rmed rmdiresista a causa delle differenze nel modo in cui la libreria C tratta ciascuna.

Ad ogni modo, il primo dovrebbe funzionare, mentre il secondo dovrebbe lamentarsi di essere una directory.

Se non funziona come sopra, controlla le tue autorizzazioni. Per rimuovere i file è necessaria l'autorizzazione di scrittura nella directory contenente.


122
Ah sì. questo ha senso. Non ho mai digitato foo, ho digitato f <tab> e bash ha compilato un / per me.
Matthew Scouten,

6
Questo non funziona sempre. Occasionalmente è necessario eseguire rm -rf folderName(senza trascinamento /) per rimuovere il collegamento simbolico. Amazon Linux si comporta in questo modo in determinate circostanze, ad esempio.
brandonscript,

18
@ r3mus: non utilizzare mai -run collegamento simbolico a meno che tu non voglia perdere tutto al suo interno. -fnon dovrebbe essere necessario neanche, tranne forse per sovrascrivere i permessi dei file.
Matthew Scharley,

27
In particolare, unlinknon ha alcuna relazione con l' lnoperazione 'link' dell'AKA. Il nome si unlinkriferisce al processo di scollegamento / rimozione di un file dalla tabella dei file del file system in modo che i contenuti vengano staccati da qualsiasi riferimento ad essi - sono scollegati. È un nome confuso che è assolutamente fuorviante quando applicato a collegamenti e collegamenti simbolici in particolare. unlinkfunzionerà con i collegamenti simbolici perché funziona con qualsiasi file indipendentemente dal tipo.
Matthew Scharley,

4
Se sei davvero preoccupato di fare qualcosa di stupido, alias rm="rm -i"penso che abbia salvato più pelli di qualsiasi altra cosa.
Matthew Scharley,

832

usa il comando "unlink" e assicurati di non avere / alla fine

$ unlink mySymLink

unlink () elimina un nome dal file system. Se quel nome era l'ultimo collegamento a un file e nessun processo ha il file aperto, il file viene eliminato e lo spazio che stava utilizzando viene reso disponibile per il riutilizzo. Se il nome era l'ultimo collegamento a un file ma tutti i processi hanno ancora il file aperto, il file rimarrà in vigore fino alla chiusura dell'ultimo descrittore di file ad esso riferito.

Penso che questo possa essere problematico se lo sto leggendo correttamente.

Se il nome si riferisce a un collegamento simbolico, il collegamento viene rimosso.

Se il nome si riferiva a un socket, a quo o dispositivo, il nome viene rimosso ma i processi che hanno l'oggetto aperto possono continuare a usarlo.

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


33
@OmarAbid La versione "rm foo /" mi spaventa. Questo sembra molto più sicuro :)
Joe Phillips,

9
In Ubuntu, ho provato con ~/c/a/file, /c/b/con ln -s ~/c/a ~/c/b/. In ~/c/b/, rm a/non funziona, rm -rf a/svuota solo l'originale a. unlink afunziona perfettamente e unlink a/non fa nulla.
Brady Trainor,

3
In OS X 10.10, unlinkè semplicemente un alias per rm. Dimostra che è rmnecessario utilizzare la disciplina adeguata quando si ha a che fare con qualsiasi parte della struttura della directory.
Doug Powers,

1
Negli script rm -feliminerà silenziosamente un collegamento indipendentemente dal fatto che esista, mentre unlinksi lamenterà se il collegamento non è presente. Non esiste un'opzione `-f 'equivalente per unlink, rende lo script più complesso.
utente Linux shonky

22
unlinkpuò eliminare file regolari. è meno ricco di funzioni rme non specifico dei symlink. rmnon elimina neanche le directory senza il -rflag. Quindi consiglio di preferire rm, ha flag per verbose e interattive; così come messaggi di avvertimento ed errore significativi.
ThorSummoner,

18

rm dovrebbe rimuovere il collegamento simbolico.

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

Utilizzare rm symlinknamema non includere una barra alla fine (non utilizzare:) rm symlinkname/. Ti verrà quindi chiesto se desideri rimuovere il link simbolico, yper rispondere sì.


63
Non ti sbagli, ma la risposta giusta è già qui e accettata (4 anni fa!). Perché preoccuparsi?
Matthew Scouten,

1
Google aveva questo come snippet in primo piano durante la ricerca di "Rimuovi un link simbolico". Forse gli è piaciuta la brevità, non sono sicuro di come funzioni la sua euristica. Comunque, ho prontamente fatto un facepalm quando ho guardato indietro alla mia riga di comando :-)
Randall

12

Supponendo che in realtà sia un collegamento simbolico,

$ rm -d symlink

Dovrebbe capirlo, ma dal momento che non è possibile abilitare il codice latente che era destinato a un altro caso che non esiste più ma capita di fare la cosa giusta qui.


7

Se rm non è in grado di rimuovere un collegamento simbolico, forse è necessario esaminare le autorizzazioni sulla directory che contiene il collegamento simbolico. Per rimuovere le voci della directory, è necessario il permesso di scrittura sulla directory contenente.


4

Supponendo che la tua configurazione sia qualcosa del tipo:, ln -s /mnt/bar ~/fooallora dovresti essere in grado di fare un rm fooproblema senza problemi. Se non ci riesci, assicurati di essere il proprietario fooe di avere il permesso di scrivere / eseguire il file. La rimozione foonon toccherà bar, a meno che non lo faccia in modo ricorsivo.


2

Su CentOS, esegui rm linknamee ti verrà chiesto di "rimuovere il collegamento simbolico?". Digitare Ye Enter, il collegamento sparirà e la directory sarà sicura.


2

Ho avuto questo problema con MinGW (in realtà Git Bash) in esecuzione su un server Windows. Nessuno dei suggerimenti di cui sopra sembrava funzionare. Alla fine è stata creata una copia della directory nel caso in cui sia stato eliminato il collegamento software in Esplora risorse, quindi è stato eliminato l'elemento nel Cestino. Emetteva rumori come se stesse cancellando i file ma non lo faceva. Fai un backup però!


3
"Ha emesso rumori come se stesse eliminando file ..." - Wow!
Sterex,

LMFAO. "Ha emesso rumori come se stesse cancellando file ..."
Shivam Jha,

Ricordo i floppy disk!
Keith Whittingham,

Nessuno dei precedenti ha funzionato per me: eddyq @ eddyq-Latitude-E6440: ~ $ ls Download desktop Dropbox-Windows Music Video pubblici w Documenti Esempi
Dropbox.desktop
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.