Esta resposta revela que é possível copiar todos os arquivos - incluindo os ocultos - do diretório src
para o diretório da seguinte dest
maneira:
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 a *
, 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 adequados, conforme explicado aqui , assim como a própria entrada do diretório.
De onde vem esse comportamento e onde está documentado?
cp
referência explica claramente comocp -R
funciona..
e..
são diretórios como qualquer outro diretório, não há nada de mágico ou misterioso neles..
e..
não se comporta como outros diretórios.Respostas:
O comportamento é um resultado lógico do algoritmo documentado para
cp -R
. Consulte POSIX , etapa 2f:.
e..
são diretórios, respectivamente, o diretório atual e o diretório pai. Nenhum dos dois é especial no que diz respeito ao shell, portanto, nem à 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
, que ésrc
ele próprio;src/src_dir/..
ésrc_dir
o diretório pai, que é novamentesrc
. Portanto, de forasrc
, sesrc
for um diretório, especificarsrc/.
ousrc/src_dir/..
como o arquivo de origemcp
é equivalente 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. Ele também copiará o conteúdo desrc
only, sem se copiarsrc
; isso também corresponde à documentação:Então,
cp -R src/. dest
copia o conteúdo desrc
paradest/.
(o arquivo de origem está.
dentrosrc
), enquantocp -R src dest
copia o conteúdo desrc
paradest/src
(o arquivo de origem estásrc
).Outra maneira de pensar nisso é comparar cópia
src/src_dir
esrc/.
, em vez de compararsrc/.
esrc
..
comporta-se comosrc_dir
no caso anterior.fonte
src
copiará o diretório paradest
,src/.
copiará o conteúdo. Vou tentar deixar isso mais claro na pergunta.src/.
esrc/*
(observe, nãosrc/.*
);src/*
não inclui arquivos ocultos se ignora englobamento eles ...src
contém,src/.
mas significa que o diretório que contém um diretório depende de como você o nomeia. Obviamente, a existência dos.
links significa que todos os diretórios se contêm, mas isso pode não ser intuitivo para todos. Em vez desse comportamento, pode-se também tentar assumir que "o diretório que contém o diretóriofoo
" seria determinado porfoo/..
, caso em que não importaria se nos referíssemos a :foo
oufoo/.
: o diretório contendo resultante seria o mesmo.foo
efoo/.
parece um pouco delicada, mas não me importo, também acho um pouco divertido.Quando você corre
cp -R src/foo dest
, você recebedest/foo
. Portanto, se o diretóriodest/foo
não existir,cp
crie-o e copie o conteúdo desrc/foo
paradest/foo
.Quando você executa
cp -R src/. dest
,cp
vê quedest/.
existe, e então é apenas a questão de copiar o conteúdo desrc/.
paradest/.
.Quando você pensa nisso como copiar um diretório chamado
.
desrc
e mesclando seu conteúdo com o diretório existentedest/.
, ele vai fazer sentido.fonte