Remover um link simbólico para um diretório

1085

Eu tenho um link simbólico para um diretório importante. Quero me livrar desse link simbólico, mantendo o diretório por trás dele.

Eu tentei rme voltei rm: cannot remove 'foo'.
Eu tentei rmdire voltou rmdir: failed to remove 'foo': Directory not empty
Eu então progrediu através rm -f, rm -rfesudo rm -rf

Depois fui procurar minhas cópias de segurança.

Existe uma maneira de se livrar do link simbólico sem jogar fora o bebê com a água do banho?

Matthew Scouten
fonte
74
o que há de errado em fazer perguntas relacionadas ao linux? da última vez que verifiquei, o estouro de pilha não era específico do sistema operacional #
Jeremy Cantrell
6
Essa pergunta não seria mais adequada ao Superusuário ou a um Stack Exchange relacionado ao Linux?
mwfearnley
45
@mwfearnley Seria, mas verifique a data. Superusuário ainda não era uma coisa naquela época. Foi portado, então também está lá. Não sei por que ainda está aqui, mas é a minha pergunta com a maior pontuação e não vou olhar carma na boca.
Matthew Scouten
16
DICA: rm -r link/ exclui o conteúdo do destino
Gayan Weerakutti 21/09
31
Then I went to find my back-ups- Isso me fez rir.
precisa saber é o seguinte

Respostas:

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

Basicamente, você precisa dizer a ele para excluir um arquivo , não para excluir um diretório . Acredito que a diferença entre rme rmdirexista devido a diferenças na maneira como a biblioteca C trata cada uma.

De qualquer forma, o primeiro deve funcionar, enquanto o segundo deve se queixar de ser um diretório.

Se não funcionar como acima, verifique suas permissões. Você precisa de permissão de gravação no diretório que contém os arquivos para remover.

Matthew Scharley
fonte
121
Ah sim. isso faz sentido. Eu nunca digitei foo, digitei f <tab> e bash preencheu um / para mim.
Matthew Scouten 5/01/09
6
Isso nem sempre funciona. Ocasionalmente, você precisa executar rm -rf folderName(sem arrastar /) para remover o link simbólico. O Amazon Linux se comporta dessa maneira em determinadas circunstâncias, por exemplo.
brandonscript
18
@ r3mus: Nunca use -rcom um link simbólico, a menos que você queira perder tudo dentro dele. -ftambém não deve ser necessário, exceto talvez para substituir as permissões de arquivo.
Matthew Scharley
27
Especificamente, unlinknão tem relação com a lnoperação de 'link' do AKA. O nome unlinkrefere-se ao processo de desvincular / remover um arquivo da tabela de arquivos do sistema de arquivos para que o conteúdo seja desanexado de qualquer referência a eles - eles são desvinculados. É um nome confuso que é totalmente enganador quando aplicado a links e links simbólicos em particular. unlinkfuncionará com links simbólicos porque funciona com qualquer arquivo, independentemente do tipo.
Matthew Scharley 08/08
4
Se você está realmente preocupado em fazer algo bobo, alias rm="rm -i"salvou mais peles do que qualquer outra coisa lá fora, eu acho.
Matthew Scharley
832

use o comando "unlink" e certifique-se de não ter o / no final

$ unlink mySymLink

unlink () exclui um nome do sistema de arquivos. Se esse nome foi o último link para um arquivo e nenhum processo foi aberto, o arquivo será excluído e o espaço utilizado foi disponibilizado para reutilização. Se o nome foi o último link para um arquivo, mas qualquer processo ainda tiver o arquivo aberto, o arquivo permanecerá em existência até que o último descritor de arquivo referente a ele seja fechado.

Eu acho que isso pode ser problemático se eu estiver lendo corretamente.

Se o nome se referir a um link simbólico, o link será removido.

Se o nome se referir a um soquete, fifo ou dispositivo, o nome é removido, mas processos com o objeto aberto podem continuar a usá-lo.

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

Joe Phillips
fonte
33
@OmarAbid A versão "rm foo /" me assusta. Este parece muito mais seguro :)
Joe Phillips
9
No Ubuntu, eu testei com ~/c/a/file,/c/b/ , com ln -s ~/c/a ~/c/b/. Em ~/c/b/, rm a/não funciona, rm -rf a/apenas esvazia o original a. unlink afunciona perfeitamente e unlink a/não faz nada.
Brady Trainor
3
No OS X 10.10, unlinké simplesmente um apelido para rm. Mostra que a rmdisciplina adequada deve ser utilizada ao lidar com qualquer parte da sua estrutura de diretórios.
Doug Powers
1
Nos scripts rm -f, silenciosamente, um link será excluído, quer exista ou não, enquanto unlinkqueixará se o link não estiver presente. Não existe uma opção `-f 'equivalente para desvincular, torna o script mais complexo.
shonky linux user
22
unlinkpode excluir arquivos regulares. é menos funcional do que rme não é específico para links simbólicos. rmtambém não exclui diretórios sem o -rsinalizador. Por isso, recomendo preferir rm, que possui sinalizadores para verboso e interativo; bem como mensagens significativas de aviso e erro.
ThorSummoner
18

rm deve remover o link simbólico.

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:~$ 
Steve K
fonte
17

Use, rm symlinknamemas não inclua uma barra no final (não use rm symlinkname/:). Você será perguntado se deseja remover o link simbólico, ypara responder que sim.

DeeEss09
fonte
63
Você não está errado, mas a resposta certa já está aqui e é aceita (há 4 anos!). Porque se importar?
Matthew Scouten
1
O Google tinha isso como o snippet em destaque ao pesquisar "Remover um link simbólico". Talvez tenha gostado da brevidade, não tendo certeza de como suas heurísticas funcionam. De qualquer forma, eu prontamente fiz um facepalm quando eu olhei para a minha linha de comando :-)
Randall
12

Supondo que seja realmente um link simbólico,

$ rm -d symlink

Deveria descobrir, mas como não podemos ativar o código latente destinado a outro caso que não existe mais, mas que faz a coisa certa aqui.

Joshua
fonte
7

Se a rm não conseguir remover um link simbólico, talvez seja necessário examinar as permissões no diretório que contém o link simbólico. Para remover as entradas do diretório, você precisa de permissão de gravação no diretório que o contém.

Greg Hewgill
fonte
4

Assumindo que sua configuração é algo como:, ln -s /mnt/bar ~/fooentão você deve conseguir fazer isso rm foosem nenhum problema. Se não puder, verifique se você é o proprietário fooe tenha permissão para gravar / executar o arquivo. A remoção foonão tocará bar, a menos que você faça isso recursivamente.

TJ L
fonte
2

No CentOS, basta executar rm linknamee ele solicitará "remover link simbólico?". Digite Ye Enter, o link desaparecerá e o diretório estará seguro.

Yuri
fonte
2

Eu tive esse problema com o MinGW (na verdade, o Git Bash) em execução no Windows Server. Nenhuma das sugestões acima parecia funcionar. No final, fez uma cópia do diretório para excluir o link virtual no Windows Explorer e o item na Lixeira. Ele fez barulhos como se estivesse excluindo os arquivos, mas não o fez. Faça um backup!

Keith Whittingham
fonte
3
"Ele fez barulhos como se estivesse excluindo arquivos ..." - Uau!
Sterex
LMFAO. "Fazia barulhos como se estivesse excluindo arquivos ..."
Shivam Jha
Lembro-me de disquetes!
Keith Whittingham
Nenhuma das opções acima funcionou para mim: eddyq @ eddyq-Latitude-E6440: ~ $ ls Desktop Downloads Dropbox-Windows Música Vídeos públicos w Documentos Dropbox examples.desktop Pictures Templates 'Arquivos vmWare vmx'
eddyq