Linux come copiare ma non sovrascrivere?


Risposte:


589

Taken from the man page:

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

Example:

cp -n myoldfile.txt mycopiedfile.txt

33
Note, this will exit with an error if the file exists. To exit with success, try cp -n source.txt destination.txt || true
galenandrew

13
@galenandrew cp -nnon si chiude con errore se il file esiste su Ubuntu 12.04.
Amit

@galenandrew Confermato. Grazie. Il mio progetto non si basava su Xcode dopo aver aggiunto uno script di esecuzione al mio target.
Ruiz,

@AaronFranke sembra proprio così.
Boris,

93

Prendi in considerazione l'utilizzo rsync.

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

Secondo i commenti rsync -a -v src dstnon è corretto perché aggiornerà i file esistenti.


7
Si desidera aggiungere il --ignore-existingflag per evitare che i file esistenti vengano sovrascritti.
Tutti i lavoratori sono essenziali il

7
Il comando completo rsync -a -v --ignore-existing <src> <dst>è davvero la risposta corretta, anziché cp -usopra.
Whitebird,

Se una copia precedente è stata interrotta e solo un file troncato è stato copiato, sono sicuro che cp -u non lo ricopia ... ma lo sincronizzerà, con --ignore-esistente? Probabilmente neanche ... quindi questo li rende perfettamente equivalenti, giusto?
dagelf

rsync mantiene il timestamp del file mentre cp utilizza l'ora corrente (nella mia esperienza)
Stefan Diabo,

1
alcuni server non hanno semplicemente rsync
mebada

51
cp -n

È quello che vuoi. Vedi la pagina man.


@AaronFranke sì, funzionerà in modo ricorsivo.
Boris,

33

Questo funzionerà su RedHat:

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

Aggiornare e non sovrascrivere è qualcosa di diverso.


4
Che cosa falsefa qui?
Frozen Flame,

11
@FrozenFlame Risposte alle -idomande.
ceving

Ovviamente, questo comando non funzionerà se proverai a copiare più di file ARG_MAX. Per aggirare questo caso, controllare questo collegamento .
mginio

2
Inoltre, ovviamente, questo comando non funzionerà se la terra si schianta contro il sole.
ceving

32

Per le persone che scoprono che non hanno un'opzione 'n' (come me su RedHat) puoi usare cp -uper scrivere il file solo se l'origine è più recente di quella esistente (o non ce n'è una esistente).

[modifica] Come menzionato nei commenti, questo sovrascriverà i file più vecchi, quindi non è esattamente quello che voleva l'OP. Usa la risposta di ceving per questo.


11
OP ha chiesto di non sovrascrivere i file esistenti anche se sono più vecchi dei file copiati , quindi -unon si adatta allo scopo.
Andrew Lott,

4
Bontà, hai assolutamente ragione. Sono sorpreso che ci sia voluto tanto tempo perché qualcuno se ne accorgesse.
Grim ...

Potrebbe non essere quello che l'OP ha richiesto, ma è esattamente quello di cui avevo bisogno per il mio Uberspace (Centos 7). Grazie!
Thomas Praxl,

Sono contento che sei anni fa potessi aiutare MrGreen
Grim ...

10

Alpine Linux: la risposta di seguito è solo per il caso di un singolo file: in alpine cp -nnon funziona (e false | cp -i ...anche) quindi la soluzione che funziona nel mio caso che ho trovato è:

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

Nell'esempio di cui sopra, se env.jsil file non esiste, allora ci copia env.example.jsa env.js.


1

Alcune versioni di cp non hanno l' opzione --no-clobber . In quel caso:

  echo n | cp -vipr src/* dst
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.