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.