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.

Abra o caminho
fonte
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

user31894
fonte
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)

Balmipour
fonte
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.

Martin Beckett
fonte
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.

Pontudo
fonte
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
grepit
fonte
1

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

# cp -au

Veja também o rsync

pixelbeat
fonte
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
Kamil Maciorowski
fonte
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.

taatparya
fonte