Como você copia diretórios no Linux nessas situações usando o cp?

4

Situação 1

Como faço para copiar /home/src/somedir para /dest/ de modo que o caminho sempre termine como /dest/somedir , independentemente de o /dest/somedir já existir?

Eu quero evitar acabar com /dest/somedir/somedir .

Situação 2

Como faço para copiar tudo dentro de /home/src/somedir para /dest/ , de modo que /dest/somedir não seja criado e seja ignorado se já existir?

Existem regras sobre as barras finais que posso usar? Eu pensei que terminar com uma barra final significava sempre copiar o conteúdo apenas, mas ainda assim muitas vezes dá errado para mim.

    
por Person 22.12.2015 / 18:29

2 respostas

6

cp sempre copiará o (s) arquivo (s) no início do comando para o arquivo ou diretório no final do comando. A barra realmente não faz muito para os argumentos, a menos que o argumento seja um link simbólico para um diretório. Então, com a barra, ela será tratada como um diretório, enquanto a omissão da barra copiará o próprio link.

Supondo que você queira copiar recursivamente todos os subdiretórios em seus exemplos, faça o seguinte:

cp -r /home/src/somedir /dest

e

cp -r /home/src/somedir/* /dest

O primeiro obtém o diretório /home/src/somedir e copiará esse argumento, o próprio diretório e todo o seu conteúdo, para o último argumento, /dest . Ele criará o diretório somedir em /dest , se necessário, e o usará se já existir.

O segundo adiciona * ao final do primeiro argumento, que o shell expandirá para ser todo arquivo que não iniciar com . em /home/src/somedir e copiará todos esses arquivos e diretórios para /dest sem levar em conta o que já está lá (exceto alguns sinalizadores para cp farão com que seja solicitado a sobrescrever arquivos que terão o mesmo no destino que um arquivo existente).

Como os comentários para esta resposta apontaram, há problemas usando * para pegar todos os arquivos no diretório. Uma alternativa seria usar tar para fazer a cópia para você

tar -c -C /home/src/somedir . | tar -x -C /dest

isso criará um arquivo tar de somedir sem o caminho principal usando -C para alternar para esse diretório primeiro. Por padrão, tar imprimirá para stdout , que será canalizado para outro tar para extraí-lo primeiro para o diretório /dest desejado. Isso também preservará muitos atributos de arquivo, que cp também pode fazer.

    
por 22.12.2015 / 19:00
2

How do I copy /home/src/somedir to /dest/ such that the path always ends up as /dest/somedir, regardless of whether /dest/somedir already exists?

cp -rv /home/src/somedir /dest

Estamos copiando «somedir» para «/ dest», então acabamos com «/ dest / somedir»

How do I copy everything inside /home/src/somedir to /dest/ such that /dest/somedir isn't created and is ignored if it already exists?

cp -rv /home/src/somedir/* /dest

Estamos copiando «todos os arquivos em um som» ( somedir/* ) para «/ dest»

Advertência: o somedir / * não inclui arquivos ocultos (aqueles que começam com um ponto).

As barras finais não afetam o processo. Você pode estar confundindo cp com rsync , onde uma barra à direita significa "copiar o conteúdo, não a pasta".

    
por 22.12.2015 / 22:35

Tags