Ele fez isso porque .
não é um nome que pode ser usado para criar um subdiretório.
cp -a . ~/xyz
cópias ./file1
a ~/xyz/./file1
, ./file2
a ~/xyz/./file2
, etc. Mas ~/xyz/./file1
e ~/xyz/file1
são iguais, então o efeito é copiar o conteúdo do diretório atual para ~/xyz
.
Você pode ver isso se adicionar a opção --verbose
a cp
para exibir cada nome de caminho conforme é copiado:
$ cp -av . ../foo/
‘./file1’ -> ‘../foo/./file1’
‘./file2’ -> ‘../foo/./file2’
Uma diferença notável entre .
e *
aqui é que cp -a . /dir
copiará os arquivos ocultos, ao contrário de *
(que não corresponde aos arquivos ocultos).
~
e *
são metacaracteres de shell, o que significa que eles são expandidos pelo shell antes de cp
vê-los. Por outro lado, .
é uma entrada de diretório comum (que por acaso aponta para o diretório que a contém). Seria possível que cp
contivesse código que detecta quando .
é a fonte de uma cópia recursiva e substitui o nome do diretório, mas isso não acontece, provavelmente porque ninguém achou importante.
Além disso, que nome deve usar? Isso é mais simples para diretórios do que arquivos, porque geralmente os sistemas de arquivos não permitem vários links físicos para um diretório (exceto as entradas .
e ..
). Mas isso não considera links simbólicos. Os shells modernos geralmente rastreiam quando você digita um diretório por meio de um link simbólico e reflete isso em pwd
.