@ slm ♦ As respostas correspondem a essa pergunta, mas essa pergunta é diferente, diz: "Supondo que você saiba que o destino é um link simbólico e não um arquivo".
Stéphane Gourichon 21/03/2015
Não parece que você aceitou uma resposta aqui @IQAndreas. Por favor, faça-o se eles o ajudaram.
Gray
Respostas:
56
Sempre que você tiver esse tipo de pergunta, é melhor conceber um pequeno teste para ver o que realmente está acontecendo. Para isso você pode usar strace.
O sistema chama unlink()e unlinkat()é essencialmente o mesmo, exceto pelas diferenças descritas nesta página de manual: http://linux.die.net/man/2/unlinkat .
excerto
A chamada do sistema unlinkat () opera exatamente da mesma maneira que unlink (2) ou rmdir (2) (dependendo de os sinalizadores incluírem ou não o sinalizador AT_REMOVEDIR), exceto pelas diferenças descritas nesta página de manual.
Se o nome do caminho fornecido no nome do caminho for relativo, será interpretado em relação ao diretório referido pelo descritor de arquivo dirfd (em vez de relativo ao diretório de trabalho atual do processo de chamada, como é feito por unlink (2) e rmdir (2) ) para um nome de caminho relativo).
Se o nome do caminho fornecido no nome do caminho for relativo e dirfd for o valor especial AT_FDCWD, o nome do caminho será interpretado em relação ao diretório de trabalho atual do processo de chamada (como unlink (2) e rmdir (2)).
Se o nome do caminho fornecido no nome do caminho for absoluto, o dirfd será ignorado.
Como está dando AT_FDCWD, efetivamente não há diferença entre unlinke unlinkat.
Barmar
6
Fico feliz em ler esta resposta, porque eu apenas "aprendi a pescar" de uma maneira poderosa e flexível, quando frequentemente compro um peixe ou, às vezes, "aprendo a pescar" de uma maneira básica em SO :-)
sábio
22
POSIX especifica que o unlinkutilitário chama a unlinkfunção da biblioteca C e nada mais. Não precisa de opção. Se você passar um nome de caminho válido para algo que não é um diretório e se tiver permissões de gravação no diretório em que esse objeto mora, ele unlinkserá removido.
rmé um comando tradicional do Unix que possui algumas outras funcionalidades e não é um superconjunto unlink(veja abaixo).
Em primeiro lugar, rmrealiza verificações de segurança. Se você tentar rmum objeto para o qual você não tem permissões de gravação (que são irrelevantes para a sua capacidade de removê-lo: as permissões diretamente são!), No rmentanto, recusa, a menos que -fseja especificado. rmnormalmente reclama se o arquivo não existe, assim como unlink; no entanto com -f, rmnão reclama. Isso é frequentemente explorado em Makefiles ( clean: @rm -f $(OBJS) ...), portanto make cleannão falha quando não há nada a remover.
Em segundo lugar, rmtem a -iopção de confirmar interativamente a exclusão.
Em terceiro lugar, rmé necessário -rremover recursivamente um diretório, o que unlinknão é necessário, pois a função da biblioteca C não faz isso.
O unlinkutilitário não é exatamente um despojado rm. Ele executa um subconjunto do que rmfaz, mas possui semântica que é uma combinação de rmwith-f e rm without-f .
Suponha que você queira apenas remover um arquivo comum, independentemente de quais sejam suas próprias permissões. Além disso, suponha que você queira que o comando falhe se o arquivo não existir ou por qualquer outro motivo. Nem rm filenem rm -f fileatende aos requisitos. rm filerecusará se o arquivo não for gravável. Mas rm -f filedeixará de reclamar se o arquivo estiver faltando. unlink filefaz o trabalho.
unlinkfoi provavelmente introduzido porque rmé muito inteligente: às vezes você quer apenas a unlinksemântica pura do Unix : "faça esta entrada de diretório desaparecer se as permissões de diretório permitirem" .
Esta é a resposta mais clara aqui. Na verdade, fornece o caso de uso para, em unlinkvez de apenas descrever as diferenças.
Wildcard
19
Com um único arquivo, rm e unlink fazem a mesma tarefa, remova o arquivo. Conforme definido pelo POSIX, rme unlinkambos chamam para desvincular () a chamada do sistema.
No GNU rm, ele chama a chamada do sistema unlinkat () , que é equivalente à função unlink()ou rmdir () , exceto no caso em que path especifica um caminho relativo.
Nota
Em alguns sistemas, unlinktambém é possível remover o diretório Pelo menos no sistema GNU, unlinknunca pode excluir o nome de um diretório.
Respostas:
Sempre que você tiver esse tipo de pergunta, é melhor conceber um pequeno teste para ver o que realmente está acontecendo. Para isso você pode usar
strace
.desvincular
rm
Quando você olha os 2 arquivos de log resultantes, pode "ver" o que cada chamada está realmente fazendo.
Demolir
Com
unlink
isso, é chamada a chamada dounlink()
sistema:Com
rm
um caminho um pouco diferente:O sistema chama
excertounlink()
eunlinkat()
é essencialmente o mesmo, exceto pelas diferenças descritas nesta página de manual: http://linux.die.net/man/2/unlinkat .fonte
AT_FDCWD
, efetivamente não há diferença entreunlink
eunlinkat
.POSIX especifica que o
unlink
utilitário chama aunlink
função da biblioteca C e nada mais. Não precisa de opção. Se você passar um nome de caminho válido para algo que não é um diretório e se tiver permissões de gravação no diretório em que esse objeto mora, eleunlink
será removido.rm
é um comando tradicional do Unix que possui algumas outras funcionalidades e não é um superconjuntounlink
(veja abaixo).Em primeiro lugar,
rm
realiza verificações de segurança. Se você tentarrm
um objeto para o qual você não tem permissões de gravação (que são irrelevantes para a sua capacidade de removê-lo: as permissões diretamente são!), Norm
entanto, recusa, a menos que-f
seja especificado.rm
normalmente reclama se o arquivo não existe, assim comounlink
; no entanto com-f
,rm
não reclama. Isso é frequentemente explorado em Makefiles (clean: @rm -f $(OBJS) ...
), portantomake clean
não falha quando não há nada a remover.Em segundo lugar,
rm
tem a-i
opção de confirmar interativamente a exclusão.Em terceiro lugar,
rm
é necessário-r
remover recursivamente um diretório, o queunlink
não é necessário, pois a função da biblioteca C não faz isso.O
unlink
utilitário não é exatamente um despojadorm
. Ele executa um subconjunto do querm
faz, mas possui semântica que é uma combinação derm
with-f
e rm without-f
.Suponha que você queira apenas remover um arquivo comum, independentemente de quais sejam suas próprias permissões. Além disso, suponha que você queira que o comando falhe se o arquivo não existir ou por qualquer outro motivo. Nem
rm file
nemrm -f file
atende aos requisitos.rm file
recusará se o arquivo não for gravável. Masrm -f file
deixará de reclamar se o arquivo estiver faltando.unlink file
faz o trabalho.unlink
foi provavelmente introduzido porquerm
é muito inteligente: às vezes você quer apenas aunlink
semântica pura do Unix : "faça esta entrada de diretório desaparecer se as permissões de diretório permitirem" .fonte
unlink
vez de apenas descrever as diferenças.Com um único arquivo, rm e unlink fazem a mesma tarefa, remova o arquivo. Conforme definido pelo POSIX,
rm
eunlink
ambos chamam para desvincular () a chamada do sistema.No GNU
rm
, ele chama a chamada do sistema unlinkat () , que é equivalente à funçãounlink()
ou rmdir () , exceto no caso em que path especifica um caminho relativo.Nota
Em alguns sistemas,
unlink
também é possível remover o diretório Pelo menos no sistema GNU,unlink
nunca pode excluir o nome de um diretório.fonte