Voglio cp
una directory ma non voglio sovrascrivere alcun file esistente anche se sono più vecchi dei file copiati. E voglio farlo completamente non interattivo in quanto questo farà parte di uno script di Crontab Bash. Qualche idea?
Voglio cp
una directory ma non voglio sovrascrivere alcun file esistente anche se sono più vecchi dei file copiati. E voglio farlo completamente non interattivo in quanto questo farà parte di uno script di Crontab Bash. Qualche idea?
Risposte:
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
cp -n source.txt destination.txt || true
cp -n
non si chiude con errore se il file esiste su Ubuntu 12.04.
Prendi in considerazione l'utilizzo rsync
.
rsync -a -v --ignore-existing src dst
Secondo i commenti rsync -a -v src dst
non è corretto perché aggiornerà i file esistenti.
--ignore-existing
flag per evitare che i file esistenti vengano sovrascritti.
rsync -a -v --ignore-existing <src> <dst>
è davvero la risposta corretta, anziché cp -u
sopra.
Questo funzionerà su RedHat:
false | cp -i source destination 2>/dev/null
Aggiornare e non sovrascrivere è qualcosa di diverso.
false
fa qui?
-i
domande.
Per le persone che scoprono che non hanno un'opzione 'n' (come me su RedHat) puoi usare cp -u
per 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.
-u
non si adatta allo scopo.
Alpine Linux: la risposta di seguito è solo per il caso di un singolo file: in alpine cp -n
non 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.js
il file non esiste, allora ci copia env.example.js
a env.js
.