Esta resposta revela que é possível copiar todos os arquivos - incluindo os ocultos - do diretório src
para o diretório da seguinte dest
forma:
mkdir dest
cp -r src/. dest
Não há explicação na resposta ou em seus comentários sobre por que isso realmente funciona, e ninguém parece encontrar documentação sobre isso também.
Eu tentei algumas coisas. Primeiro, o caso normal:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Então, com /.
no final:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Portanto, isso se comporta de maneira semelhante ao *
, mas também copia arquivos ocultos.
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.
e ..
são links físicos apropriados, conforme explicado aqui , assim como a própria entrada do diretório.
De onde vem esse comportamento e onde está documentado?
O comportamento é um resultado lógico do algoritmo documentado para
cp -R
. Veja POSIX , passo 2f:.
e..
são diretórios, respectivamente o diretório atual e o diretório pai. Nenhum deles é especial no que diz respeito ao shell, portanto, nenhum deles se preocupa com a expansão e o diretório será copiado, incluindo arquivos ocultos.*
, por outro lado, será expandido para uma lista de arquivos, e é aqui que os arquivos ocultos são filtrados.src/.
é o diretório atual dentrosrc
de , que ésrc
ele mesmo;src/src_dir/..
ésrc_dir
o diretório pai de , que é novamentesrc
. Portanto, de forasrc
, sesrc
for um diretório, especificarsrc/.
ousrc/src_dir/..
como o arquivo de origem paracp
são equivalentes e copiar o conteúdo desrc
, incluindo arquivos ocultos.O ponto de especificar
src/.
é que ele falhará sesrc
não for um diretório (ou link simbólico para um diretório), enquantosrc
não seria. Ele também copiará o conteúdo desrc
apenas, sem copiarsrc
a si mesmo; isso também corresponde à documentação:So
cp -R src/. dest
copia o conteúdo desrc
todest/.
(o arquivo de origem está.
emsrc
), enquantocp -R src dest
copia o conteúdo desrc
todest/src
(o arquivo de origem está emsrc
).Outra maneira de pensar nisso é comparar copiar
src/src_dir
esrc/.
, em vez de compararsrc/.
esrc
..
comporta-se comosrc_dir
no caso anterior.Quando você correr
cp -R src/foo dest
, você receberádest/foo
. Portanto, se o diretóriodest/foo
não existir,cp
ele será criado e, em seguida, copiará o conteúdo desrc/foo
paradest/foo
.Quando você executa o
cp -R src/. dest
,cp
vê quedest/.
existe, e aí é só copiar o conteúdo dosrc/.
todest/.
.Quando você pensa nisso como copiar um diretório nomeado
.
desrc
e mesclar seu conteúdo com o diretório existentedest/.
, isso fará sentido.