copiando diretórios paralelos Por que o cp -r funciona dessa maneira?

2

O seguinte funciona corretamente (ou seja, faz o que eu quero)

 cd /var/www/release/
 mkdir wiki
 cp -rp ../html/wiki ./

No entanto, se eu fizer (o que parece mais intuitivo)

 cp -r ../html/wiki ./wiki

ele irá criar / var / www / release / wiki / wiki (o que eu nunca quero)

Esse comportamento é o mesmo com mv. Eu espero que alguém explique a lógica por trás desse comportamento para que eu acerte da primeira vez no futuro

    
por zzapper 25.07.2014 / 16:29

3 respostas

1

Se você deseja copiar um diretório inteiro como SOURCE , cp deseja um diretório como DESTINATION , para saber onde ele deve ser armazenado.

O erro que você fez não foi remover o diretório /var/www/release/wiki após o teste mkdir e cp -rp ... .

Então cp -r ... fez o que você mandou fazer: Copie ../html/wiki para o diretório existente ./wiki e crie outro subdiretório chamado wiki .

Basta remover /var/www/release/wiki e, em seguida, executar novamente o comando cp -r , e você verá como funciona.

    
por 25.07.2014 / 16:41
1

Existem 3 formas de cp e mv

cp/mv [OPTION]... [-T] SOURCE DEST
cp/mv [OPTION]... SOURCE... DIRECTORY
cp/mv [OPTION]... -t DIRECTORY SOURCE...

Formulário 1 e 2 são do formulário cp/mv a b , no formato 2 b é um diretório existente, mas no formato 1 b é um destino. Para evitar essa ambigüidade, não use o formulário 2. Use o formulário 1 para o que você está tentando fazer com -T . Use o formulário 3 para mover ou copiar para um diretório existente.

    
por 25.07.2014 / 17:17
1

Quando o último argumento para cp é um diretório existente, cp copia o (s) arquivo (s) de origem para esse diretório. mv faz o mesmo.

Você gostaria de mesclar o diretório de origem com o diretório de destino. Mas isso só faria sentido quando a fonte fosse um diretório. Então, quando você executa cp somefile existing-directory/ , acaba com existing-directory/somefile ; e quando você executa cp -r somedir existing-directory/ , acaba com existing-directory/somedir . O comportamento que você acha intuitivo (mas que eu não entendo) exigiria que cp faça diferença dependendo se a origem é um diretório ou não, portanto, cp -r somefile somedir existing-directory/ criaria existing-directory/somefile , mas não existing-directory/somedir . / p>

cp something existing-directory copia a origem no diretório de destino. Se a fonte for um diretório e você quiser copiar seu conteúdo, execute

cp -rp something/* existing-directory/

Observe que isso omite arquivos cujo nome começa com . . Se você quiser incluí-los, uma maneira fácil é usar rsync :

rsync -a something/ existing-directory/

Com rsync , se você colocar um / no final da fonte, o conteúdo da origem será copiado no diretório de destino. Sem um / à direita na origem, a origem é criada como uma entrada no diretório de destino.

    
por 26.07.2014 / 16:19

Tags