O comportamentoI understand that this is useful. But I'm a bit confused because it seems this feature breaks standards.
cp ao copiar recursivamente de a/.
para b
é perfeitamente consistente com seu comportamento "normal".
Por padrão, o cp não cria diretórios pai. Isso pode ser modificado com a opção parents :
--parents
use full source file name under DIRECTORY
Mas o que isso significa?
Isso significa que, enquanto o comando
cp --parents -r some/path/to/source dest
copiará o conteúdo do diretório de origem em dest/some/path/to/source
, o comando
cp -r some/path/to/source dest
copiará o conteúdo do diretório de origem em dest/source
.
Da mesma forma, o comando
cp -r some/path/to/source/. dest
copiará o conteúdo do diretório de origem em dest/.
, que é apenas dest
.
I thought
a
anda/.
is the same path.
a
e a/.
é o mesmo caminho. Mas como um argumento para cp , é apenas uma string.
Note que os comandos
cp --parents -r some/path/to/source dest
e
cd some/path/to && cp --parents -r source dest
também se comportará de maneira diferente.
What about
cp -r a/inner/.. b
? Taking into account your explanation, should not it copy files tob/..
(i.e. to the current directory)?
Bem, sim. Esta é uma exceção.
Pelo menos na versão GNU de cp , há um caso especial para o ..
basename.
Em coreutils-8.22/src/cp.c
:
if (parents_option)
{
[removed]
}
else
{
char *arg_base;
/* Append the last component of 'arg' to 'target_directory'. */
ASSIGN_BASENAME_STRDUPA (arg_base, arg);
/* For 'cp -R source/.. dest', don't copy into 'dest/..'. */
dst_name = (STREQ (arg_base, "..")
? xstrdup (target_directory)
: file_name_concat (target_directory, arg_base,
NULL));
}
A motivação parece ser evitar a cópia fora da pasta de destino, o que - embora perfeitamente consistente com o comportamento do cp em todos os outros casos - é um pouco contraintuitivo e pode ter consequências desagradáveis.
Afinal, eu não acho que alguém esperaria o comando
cp -r .. ~
para afetar arquivos fora de seu diretório pessoal ...