Um diretório é (conceitualmente) um "arquivo" especial que contém uma lista de nomes e os números dos inodes para os quais esses nomes apontam. Alguns dos nomes podem ser subdiretórios. Há uma entrada especial ..
que aponta para o diretório pai.
Portanto, é claro, é fácil alterar o nome de um arquivo: basta alterar o nome na entrada do diretório, nada mais. Isso mantém se o arquivo é realmente um arquivo ou é um "arquivo" usado para armazenar o conteúdo de outro diretório. De fato, o mesmo rename
syscall faz as duas coisas.
Copiar, no entanto, é uma operação muito menos trivial. Você pode simplesmente copiar o diretório "arquivo", mas então você tem dois diretórios onde os arquivos são os mesmos (seriam links físicos). Se você tivesse um sistema que permita links diretos para diretórios, seria o caso, mas como nenhum sistema moderno permite isso, pelo menos para não-root, é necessário fazer essa cópia para cada subdiretório. Você pode realmente solicitar cp
esse comportamento com cp -lR
: -l
para link -R
físico , para essa recursão.
Mas deixar tudo vinculado provavelmente não é o que você deseja. Em vez disso, você deseja cp
copiar cada arquivo. Essa é uma operação bastante cara: cada arquivo deve ser lido na memória e gravado novamente em disco em um segundo local. Na verdade, são necessários vários syscalls para abrir, ler, gravar e fechar os arquivos, e isso deve ser repetido para cada arquivo.
Os sistemas de arquivos tradicionais também funcionam dessa maneira no disco. Não há como copiar um monte de arquivos, além de examiná-los individualmente e copiá-los, e esses são os tipos de sistemas de arquivos que estavam em uso quando os utilitários básicos da linha de comando foram projetados.
mv
passando de um sistema de arquivos para outro o mesmo "basta alterar o nome na entrada do diretório"?