cp copiando mais do que é solicitado

3

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?

    
por fabjoa 05.11.2010 / 22:39

2 respostas

0

cp -r /wordpress/3.0.1/* / mySite

    
por 05.11.2010 / 22:46
3

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 .

    
por 05.11.2010 / 23:04