Por que 'cp' e 'rm' tratam diretórios separadamente?

10

Por que ferramentas como cp e rm tratam diretórios separadamente dos arquivos regulares? Ambos exigem que o usuário especifique explicitamente que deseja um comportamento recursivo, ou então eles não lidarão com diretórios.

Minha primeira interação (um tempo atrás) com computadores foi em um ambiente Windows / GUI / apontar e clicar / arrastar e soltar, sempre pareceu natural que essas operações se comportassem da mesma maneira, independentemente do destino.

Esse comportamento me frustra particularmente quando dou comandos com curingas. E se eu quiser remover tudo em um diretório ( * ), exceto para subdiretórios não vazios ?

Eu só posso imaginar que isso é algum tipo de recurso de segurança para evitar que o usuário se atire no pé, mas isso contradiz minha compreensão de alguns princípios do Unix:

  • O Unix geralmente não protege o usuário de si mesmo. Sempre assumiu que o usuário sabe o que está fazendo.
  • Para o Unix, tudo é um arquivo. Não é um diretório apenas outro arquivo? Por que eles são tratados de maneira diferente?

Minhas perguntas:

  • Esse comportamento é decorrente de uma limitação técnica ou é uma escolha deliberada?

E no caso deste último,

  • há algum relato histórico das razões que motivaram essa escolha?
por rahmu 01.03.2013 / 21:01

2 respostas

11

Derobert's Por que o programa unix mv não precisa de opção -R (recursiva) para diretórios, mas o CP precisa dele? basicamente responde a sua pergunta: copiar ou remover um arquivo regular é diferente de fazer a mesma operação com um diretório, porque para um diretório você tem que processar todos os arquivos contidos nele. Por isso, a operação é fundamentalmente diferente.

Também vale a pena notar que existe um utilitário especial rmdir , que só pode atuar em diretórios vazios. Sem verificar os fatos, isso leva a concluir que talvez originalmente rm só pudesse remover não-diretórios e a remoção profunda tivesse que ser obtida recursivamente usando rm para diretórios vazios e, em seguida, rmdir para removê-los.

    
por 01.03.2013 / 21:49
2

Em alguns tipos de UNIX, a página man de rm especifica como um comando para desvincular um arquivo.
No UNIX, os arquivos são objetos no sistema de arquivos chamados Inodes, sem nomes ou localização além de um ID no sistema de arquivos. Seus nomes são referências a eles em vários diretórios, que são um tipo de arquivo que está indexando os arquivos (ou diretórios, uma vez que são arquivos) que estão listados nele. Ao desvincular um arquivo, a contagem de referência do arquivo diminui, e quando ele atinge 0, ele é de fato excluído, já que está marcado como livre pelo sistema de arquivos e seus blocos / extensões são marcados como livres também.

Se você tivesse a capacidade de rm um diretório sem desvincular os arquivos dentro dele primeiro, você alcançaria um ponto em que você tem inodes referenciados em seu sistema de arquivos, mas não pode ser acessado por qualquer meio normal. Como há uma referência a eles de acordo com sua contagem de referência, eles não são marcados como excluídos e se tornam arquivos perdidos.
Isso fica ainda mais complexo quando os "arquivos" perdidos são diretórios e, como tal, aumenta a quantidade potencial de armazenamento perdido no sistema de arquivos.

Então rm -r foi adicionado, como um recurso para facilitar a vida dos usuários do UNIX, em detrimento do padrão "UNIX spirit", já que é mais complexo que os utilitários clássicos do UNIX, pois está descendo para diretórios e removendo arquivos dentro de ,

Além disso, nos primórdios do UNIX, os sistemas não tinham muita memória e o mapeamento da estrutura recursiva de um diretório tinha uma penalidade de desempenho e, às vezes, era impossível fazê-lo sem dividir o trabalho.

cp, lê um arquivo e o copia, bloco por bloco. Se fosse copiar um diretório da mesma forma que um arquivo, ele adicionaria referências aos arquivos sem aumentar sua contagem de referências, o que poderia levar a dados inconsistentes (se lendo / escrevendo em um inode que os blocos estão marcados como livres desde que o inode original foi excluído), dados perdidos - uma vez que a exclusão da última referência (conhecida) de um arquivo pode fazer com que o número de inode seja reciclado.

Para a multidão dr .:
Os diretórios no UNIX são um tipo de arquivo, isso é verdade, mas como as informações neles são tratadas diferentemente pelo sistema, como são metadados do sistema de arquivos, os comandos que manipulam arquivos não podem funcionar em diretórios sem alterar seu comportamento para manipular o arquivo. metadados dependentes também.

    
por 02.03.2013 / 17:38

Tags