Copie arquivos no Linux, evite a cópia se houver arquivos no destino


32

Preciso copiar uma pasta / home / user de um disco rígido para outro. Possui 100.000 arquivos e tamanho 10G.

eu uso

cp -r /origin /destination

Às vezes, recebo alguns erros devido a links quebrados, permissões e assim por diante. Por isso, corrijo o erro e preciso iniciar novamente a cópia.

Gostaria de saber como eu poderia dizer ao comando "cp", uma vez que ele tenta copiar novamente, para não copiar arquivos novamente se eles existirem na pasta de destino.


2
Não nos cp. Use o rsync.
William Pursell

Respostas:


22

cp -R -u -p /source /destination

O sinalizador -u( ou--update ) faz exatamente isso:

Na página de manual do cp:

-u, --update

copiar somente quando o arquivo SOURCE for mais novo que o arquivo de destino ou quando o arquivo de destino estiver ausente


6
Para literalmente copiar apenas arquivos que não existem e não atualizar os já existentes, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, --update copy somente quando o arquivo SOURCE for mais novo que o arquivo de destino ou quando o arquivo de destino estiver ausente -u, --update copy somente quando o arquivo SOURCE for mais novo que o arquivo de destino ou quando o arquivo de destino estiver ausente -p igual a --preserve = mode, propriedade, registro de data e hora --preserve [= ATTR_LIST] preserva os atributos especificados (padrão: modo, propriedade, registro de data e hora), se possível atributos adicionais: contexto, links, xattr, todos
Covich

51

Apenas use cp -n <source> <dest>.

Na página do manual :

-n, --no-clobber

NÃO substitua um arquivo existente (substitui uma opção -i anterior)


7
Esta é a única resposta verdadeira para a pergunta.
sebix

20

rsync -aq /src /dest

Além de copiar apenas arquivos mais recentes, ele apenas copiará as partes mais novas dos arquivos se o arquivo tiver sido alterado. Ele é destinado a copiar em links de rede onde você deseja minimizar a quantidade de dados - mas também funciona muito bem localmente.


Não consigo adicionar `` formatação à sua postagem porque são apenas dois caracteres. Como você se sentiria ao editar isso e adicionar `` caracteres ao seu comando?
Culix 24/04

4

Procure a opção "-u" para o cpcomando.


2
Discorde que usar -u é uma boa ideia. -u copia apenas quando a fonte é mais nova ou o destino está ausente. O problema do pôster original foi causado pela quebra da cópia do arquivo por qualquer motivo. Portanto, o OP teria um arquivo semi-escrito que não foi atualizado ao executar novamente a cópia. Esse arquivo pode ser importante para alguém! O rsync resolve esse problema.
hazymat

2

Todas as respostas acima estão corretas, mas se você estiver fazendo isso recursivamente,

você deveria fazer:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

Você deve copiar como root para manter permissões / propriedade

# cp -au

Veja também o rsync


1

Solução POSIX

Outras respostas usam -u ou -nopções de cp. Nenhuma delas é exigida pelo POSIX ; nem é rsyncde mais uma resposta; nem é yesusado em um dos comentários.

Ainda podemos reproduzir yes ncom um whileloop. Isso leva à seguinte solução POSIX:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

Usar cp -rn <sourcedirname>/. <destdirname>

A opção r torna a cópia recursiva nos diretórios.

A opção n (versão longa sem obstrução) garante que os arquivos existentes nunca sejam substituídos.

O ' /.' após o sourcedirname garante que ele não se torne um subdiretório sob o destdirname, em vez de todo o conteúdo do primeiro ser copiado para o último.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.