Voglio cpuna 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 cpuna 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 -nnon 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 dstnon è corretto perché aggiornerà i file esistenti.
--ignore-existingflag per evitare che i file esistenti vengano sovrascritti.
rsync -a -v --ignore-existing <src> <dst>è davvero la risposta corretta, anziché cp -usopra.
Questo funzionerà su RedHat:
false | cp -i source destination 2>/dev/null
Aggiornare e non sovrascrivere è qualcosa di diverso.
falsefa qui?
-idomande.
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.
-unon si adatta allo scopo.
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.