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
aanda/.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 ...