cp -r /wordpress/3.0.1/* / mySite
Eu vou com o seguinte em bash
cp -r "/wordpress/3.0.1/" "/mySite/"
e o resultado é /mySite/3.0.1/
, mas não quero nem entendo por que o 3.0.1/
aparece no destino.
O que estou fazendo de errado?
Este é um desvio da especificação POSIX , que afirma que
A pathname that contains at least one non-slash character and that ends with one or more trailing slashes shall be resolved as if a single dot character ( '.' ) were appended to the pathname.
Mas no Linux (ou seja, com o comando cp
de GNU coreutils , cp -r foo/ bar/
age como cp -r foo bar/
em vez de cp -r foo/. bar/
quando foo
é um diretório¹. (GNU coreutils não é o único culpado, apenas observei o mesmo comportamento no OpenBSD, que geralmente é bom em conformidade com padrões).
Você pode executar cp -r "/wordpress/3.0.1/." "/mySite/"
(ou seja, terminar a origem com /.
) para evitar o nível 3.0.1/
. Outra possibilidade é rsync -r "/wordpress/3.0.1/" "/mySite/"
.
Como um aparte, eu recomendo adquirir o hábito de cp -a
em vez de cp -r
se você não usar unices além do Linux e Cygwin. Quando você notar a diferença, -a
(que preserva permissões e links simbólicos) é geralmente o correto. Em outros unices, use cp -Rp
. Com rsync
, use -a
.