Linux como copiar, mas não substituir?


Respostas:


589

Retirado da página de manual :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

Exemplo:

cp -n myoldfile.txt mycopiedfile.txt

33
Observe que isso será encerrado com um erro se o arquivo existir. Para sair com sucesso, tente cp -n source.txt destination.txt || true
— galenandrew

13
@galenandrew cp -nnão sai com erro se o arquivo existir no Ubuntu 12.04.
— amit

@galenandrew Confirmado. Obrigado. Meu projeto não estava sendo construído no Xcode depois de adicionar um script de execução ao meu destino.
— Ruiz

@AaronFranke parece que sim.
— Boris

93

Considere usar rsync.

rsync -a -v --ignore-existing src dst

Conforme comentários rsync -a -v src dstnão está correto, porque ele atualizará os arquivos existentes.


7
Você deseja adicionar o --ignore-existingsinalizador para impedir que os arquivos existentes sejam substituídos.
— Todos os trabalhadores têm Essencial

7
Comando completo rsync -a -v --ignore-existing <src> <dst>é realmente a resposta correta, em vez de cp -uacima.
— Whitebird

Se uma cópia anterior foi interrompida e apenas um arquivo truncado foi copiado, tenho certeza que o cp -u não a copiará novamente ... mas será rsync, com --ignore-existente? Provavelmente também não ... então isso os torna perfeitamente equivalentes, certo?
— dagelf

rsync mantém o timestamp arquivo enquanto cp usa a hora atual (na minha experiência)
— Stefan Diabo

11
alguns servidores apenas não tem rsync
— mebada

51
cp -n

É o que você quer. Veja a página do manual.


@AaronFranke sim, funcionará recursivamente.
— Boris

33

Isso funcionará no RedHat:

false | cp -i source destination 2>/dev/null

Atualizar e não substituir é algo diferente.


4
O que falsefaz aqui?
— Frozen Flame

11
@FrozenFlame Responde a -iperguntas.
— ceving

Obviamente, esse comando não funcionará se você tentar copiar mais do que arquivos ARG_MAX. Para contornar esse caso, verifique este link .
— mginius

2
Obviamente, esse comando não funcionará se a Terra colidir com o sol.
— ceving 27/01

32

Para pessoas que acham que não tem uma opção 'n' (como eu no RedHat), você pode usar cp -upara escrever o arquivo apenas se a fonte for mais nova que a existente (ou se não houver).

[editar] Como mencionado nos comentários, isso substituirá os arquivos mais antigos, portanto não é exatamente o que o OP queria. Use a resposta de ceving para isso.


11
O OP pediu para não sobrescrever os arquivos existentes, mesmo que sejam mais antigos que os arquivos copiados , portanto -u, na verdade, não se encaixa.
— Andrew Lott

4
Deus, você está absolutamente certo. Estou surpreso que demorou tanto para alguém perceber.
— Grim ...

Pode não ser o que o OP pediu, mas é exatamente o que eu precisava para o meu Uberspace (Centos 7). Obrigado!
— Thomas Praxl

Estou feliz há seis anos que eu poderia ajudar :-D
— Grim ...

10

Alpine linux: A resposta abaixo é apenas para o caso de um único arquivo: no alpine cp -nnão está funcionando (e false | cp -i ...também), portanto, a solução que funciona no meu caso que eu encontrei é:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

No exemplo acima, se o env.jsarquivo não existir, copiaremos env.example.jspara env.js.


1

Algumas versões do cp não têm a opção --no-clobber . Nesse caso:

  echo n | cp -vipr src/* dst
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.