A forma como os sistemas de arquivos funcionam, um diretório não é realmente uma pasta contendo arquivos, mas um diretório é um arquivo que contém ponteiros inode para arquivos “filhos” conectados a ele. Ou seja, do ponto de vista do sistema de arquivos, um arquivo é um arquivo, mas um diretório é apenas um arquivo que contém uma lista de arquivos conectados.
Então, na perspectiva da linha de comando, fazendo isso:
$ cp dir1 copyDir1
Basicamente significaria copiar o arquivo chamado, dir1
para um novo arquivo chamado copyDir1
. E no que diz respeito ao sistema de arquivos, dir1
é apenas um arquivo; o fato de ser um "diretório" só será aparente quando o sistema de arquivos realmente verificar dir1
para ver o que essa pilha de bits realmente é.
O sinal -r
diz ao sistema de arquivos para recursivamente percorrer a árvore de diretórios / arquivos e copiar qualquer & todo o conteúdo que pode ser um "filho" desse arquivo para um novo lugar.
Agora, por que isso pode parecer supérfluo ou redundante, isso se resume a métodos históricos de lidar com sistemas de arquivos. Além de criar um sistema seguro contra todos os tipos de erros relacionados ao usuário; acidental e intencional.
Ou seja, digamos que você tenha um arquivo ~/bin
no seu diretório pessoal que deseja copiar, mas acidentalmente tenha omitido o ~
- porque você é humano e comete erros - então é apenas /bin
assim:
cp /bin/ ~/copy_of_bin
Com a "rede de segurança" de /bin
sendo um diretório combinado com a necessidade do -r
, você evitará copiar acidentalmente toda a raiz binária do sistema no seu diretório pessoal. Se essa rede de segurança não existisse, um desastre menor - ou possivelmente maior - aconteceria.
A lógica aqui é que nos dias pré-GUI (interfaces gráficas com o usuário) as convenções lógicas / comportamentais precisam ser configuradas para evitar ter contratempos criados pelo usuário que possam potencialmente matar um sistema. E usar o -r
flag agora é um deles.
Se isso parece supérfluo, então não precisa procurar mais do que o moderno sistema de GUI que pode ser colocado acima dos sistemas de arquivos do Linux. Uma GUI aborda problemas básicos de usuários como este, permitindo arrastar e soltar arquivos e diretórios com facilidade.
No entanto, no caso do domínio das interfaces baseadas em texto, muitas das “experiências do usuário” dentro desse mundo são basicamente apenas lombadas de estradas lógicas e hueristicas que ajudam a manter o usuário sob controle para que desastres em potencial possam ser evitados. Da mesma forma, é por isso que os sistemas de arquivos Linux / Unix não têm 777
permissões e sudo
direitos definidos por padrão e o quanto os administradores de sistemas reais mudam quando um usuário define 777
permissões ou concede a todos sudo
direitos. Essas são as coisas básicas que se faz para garantir que o sistema seja estável e “à prova do usuário” quanto possível; qualquer um que se apresse em curto-circuito com essas convenções provavelmente causará danos ao seu sistema sem nem mesmo saber disso.
INFORMAÇÃO ADICIONAL: Outra resposta aqui no site Unix Stack Exchange dá uma boa explicação por que uma cópia não recursiva de um diretório é problemática; a ênfase é minha.
Well, without the -R flag, it's only possible to copy files, because it's rather unusual that someone wants to non-recursively copy a directory: A non-recursive copy would just result in a second name for the directory, pointing to directly the same directory structure. Because that's rarely what people want, and there is actually a separate program that does this (ln), a non-recursive copy of directories is not allowed.
Portanto, se um diretório é realmente um arquivo com itens inode dentro dele, fazer uma cópia direta desse arquivo seria o equivalente a como um link físico funcionaria. Que não é o que alguém quer.