Linux cómo copiar pero no sobrescribir?


Quiero cp un directorio, pero no quiero sobrescribir ningún archivo existente, incluso si son más antiguos que los archivos copiados. Y quiero hacerlo completamente noniteractive como esto será una parte de un guion de Crontab Bash. Alguna idea?

 267
Author: ceving, 2012-02-22

6 answers

Tomado de la página de manual :

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

Ejemplo:

cp -n myoldfile.txt mycopiedfile.txt
 401
Author: hovanessyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 18:56:30

Considere usar rsync.

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

Según los comentarios rsync -a -v src dst no es correcto porque actualizará los archivos existentes.

 56
Author: Hans Ginzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 13:51:11
cp -n

Es lo que quieres. Vea la página de manual.

 44
Author: bucko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-22 10:11:25

Para las personas que encuentran que no tienen una opción 'n' (como yo en RedHat), puede usar cp -u para escribir el archivo solo si la fuente es más reciente que la existente (o no hay una existente).

[editar] Como se mencionó en los comentarios, esto sobrescribirá archivos antiguos, por lo que no es exactamente lo que el OP quería. Usa la respuesta de Ceving para eso.

 30
Author: Grim...,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-19 15:21:28

Esto funcionará en RedHat:

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

Actualización y no sobrescribir es algo diferente.

 24
Author: ceving,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-15 09:20:21

Alpine linux: La respuesta a continuación es solo para el caso de un solo archivo: en alpine cp -n no funciona (y false | cp -i ... también), por lo que la solución que funciona en mi caso que encontré es:

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

En el ejemplo anterior comprobamos si existe el archivo env.js y si no, copiamos env.example.js como env.js.

 6
Author: Kamil Kiełczewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-24 15:56:47