"A otimização prematura é a raiz de todo mal (ou pelo menos a maior parte) na programação". - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth
chris
Respostas:
68
Ambos são um invólucro para a mesma função fundamental que é uma unlink()chamada do sistema.
Para ponderar as diferenças entre os utilitários da terra do usuário.
rm(1):
Mais opções.
Mais feedback.
Verificação de sanidade.
Um pouco mais lento para chamadas únicas como resultado do exposto acima.
Pode ser chamado com vários argumentos ao mesmo tempo.
unlink(1):
Menos verificação de sanidade.
Não foi possível excluir os diretórios.
Não foi possível realizar a recursão.
Só pode aceitar um argumento de cada vez.
Marginalmente mais inclinado para chamadas únicas devido à sua simplicidade.
Mais lento quando comparado com o fornecimento de rm(1)vários argumentos.
Você pode demonstrar a diferença com:
$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'
$ touch $(seq 1 100)
$ time rm $(seq 1 100)
real 0m0.048s
user 0m0.004s
sys 0m0.008s
$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done
real 0m0.207s
user 0m0.044s
sys 0m0.112s
$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done
real 0m0.167s
user 0m0.048s
sys 0m0.120s
Se, no entanto, estamos falando de uma chamada não adulterada para a unlink(2)função do sistema , que agora percebo que provavelmente não é o que você está respondendo.
Você pode executar um sistema unlink()em diretórios e arquivos. Mas se o diretório for pai de outros diretórios e arquivos, o link para esse pai será removido, mas os filhos ficarão pendentes. O que é menos que o ideal.
Editar:
Desculpe, esclareceu a diferença entre unlink(1)e unlink(2). A semântica ainda vai diferir entre as plataformas.
Isso significa que, nos sistemas de arquivos unix, a remoção de um diretório e recursivamente todos os arquivos nele sempre serão uma operação proporcional ao número de arquivos / diretórios que ele contém? Quando acontece quando eu desvinculo um diretório que é pai de outros diretórios / arquivos? Isso nunca acaba e eu perdi esse espaço para sempre?
Marcin
6
É tecnicamente possível deixar diretórios / arquivos órfãos na maioria, se não em todos os sistemas de arquivos. Corrigir isso geralmente significa executar uma ferramenta de reparo do sistema de arquivos. No Unix / Linux, essas ferramentas são conhecidas como 'fsck' e algumas variações específicas para diferentes sistemas de arquivos. Se eles recuperarem algo, normalmente o deixarão em um diretório chamado 'lost + found'
ConcernedOfTunbridgeWells
11
Corrigir. rm vai recuar do fundo da árvore para cima. Você pode demonstrar como com: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Se você desvinculou o diretório pai, o espaço consumido pelos filhos deve ser perdido até que fsck encontre a discrepância.
10119 Dan Carley
11
Do que você está falando? $ mkdir -p 1/2/3 $ unlink 1 desvincular: não é possível desvincular `1 ': Um diretório Os usuários que causam vazamento de" memória "exigem fsck? Improvável!
Thomas
11
As páginas de manual do Linux e do FreeBSD afirmam explicitamente que ele falhará ao tentar executar o unlink () em um diretório.
Thomas
8
No nível de especificação do POSIX, o que rm faz é especificado com muito mais rigor do que o que desvincula .
É provável que a portabilidade do resultado seja melhor usando rm, se o seu script precisar ser executado nos SOs.
A parte mais lenta da remoção é o código do sistema de arquivos e o material do disco, não a preparação do espaço do usuário da chamada do sistema unlink ().
Ou seja: se a diferença de velocidade for importante, você não deve armazenar os dados no sistema de arquivos.
desvincular é apenas uma "luz" rm. O rm tem mais recursos, mas eles fazem a mesma coisa.
Respostas:
Ambos são um invólucro para a mesma função fundamental que é uma
unlink()
chamada do sistema.Para ponderar as diferenças entre os utilitários da terra do usuário.
rm(1)
:unlink(1)
:rm(1)
vários argumentos.Você pode demonstrar a diferença com:
Se, no entanto, estamos falando de uma chamada não adulterada para a
unlink(2)
função do sistema , que agora percebo que provavelmente não é o que você está respondendo.Você pode executar um sistema
unlink()
em diretórios e arquivos. Mas se o diretório for pai de outros diretórios e arquivos, o link para esse pai será removido, mas os filhos ficarão pendentes. O que é menos que o ideal.Editar:
Desculpe, esclareceu a diferença entre
unlink(1)
eunlink(2)
. A semântica ainda vai diferir entre as plataformas.fonte
mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1
. Se você desvinculou o diretório pai, o espaço consumido pelos filhos deve ser perdido até que fsck encontre a discrepância.No nível de especificação do POSIX, o que rm faz é especificado com muito mais rigor do que o que desvincula .
É provável que a portabilidade do resultado seja melhor usando rm, se o seu script precisar ser executado nos SOs.
fonte
A parte mais lenta da remoção é o código do sistema de arquivos e o material do disco, não a preparação do espaço do usuário da chamada do sistema unlink ().
Ou seja: se a diferença de velocidade for importante, você não deve armazenar os dados no sistema de arquivos.
desvincular é apenas uma "luz" rm. O rm tem mais recursos, mas eles fazem a mesma coisa.
fonte