Um diretório é (conceitualmente) um "arquivo" especial que contém uma lista de nomes e os números de inode para os quais os nomes apontam. Alguns dos nomes podem ser subdiretórios. Há uma entrada especial ..
que aponta para o diretório pai.
Então, é claro, alterar o nome de um arquivo é fácil: 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 ambos.
Copiar, no entanto, é uma operação muito menos trivial. Você poderia apenas copiar o diretório "file", mas então você teria dois diretórios onde os arquivos são os mesmos (eles seriam hardlinks). Se você tivesse um sistema que permitisse hardlinks para diretórios, eles seriam, mas como nenhum sistema moderno permite isso, pelo menos para não-root, você precisa fazer essa cópia para cada subdiretório. Você pode pedir a cp
para esse comportamento com cp -lR
: -l
para link físico, -R
para essa recursão.
Mas deixar tudo vinculado provavelmente não é o que você deseja. Em vez disso, você deseja que cp
copie cada arquivo. Essa é uma operação bastante cara: cada arquivo deve ser lido na memória e gravado de volta no 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 passar por cada um deles individualmente e copiá-los, e esses são os tipos de sistemas de arquivos que estavam em uso quando os utilitários de linha de comando básicos foram projetados.