2012-02-22 26 views
240

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 no interactivo ya que esto será parte de un script de Crontab Bash. ¿Algunas ideas?Linux cómo copiar pero no sobreescribir?

+0

https://unix.stackexchange.com/questions/67539/how-to-rsync-only-new-files – n611x007

Respuesta

358

tomada de la man page:

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

Ejemplo:

cp -n myoldfile.txt mycopiedfile.txt 
+56

en lugar de utilizar 'rsync -a -v --ignore-existente ' 'Hice – Whitebird

+2

cp -n config.js.sample config.js' y funciona –

+0

@ La solución de Whitebird también está activa. –

42
cp -n 

es lo que quieres. Ver la página man.

30

Para las personas que encuentran que no tienen una opción 'n' (como yo en RedHat) se puede utilizar para cp -u solo escriba el archivo si la fuente es más nueva que la existente (o no existe).

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

+7

OP pidió no sobrescribir los archivos existentes ** incluso si son más antiguos que los archivos copiados **, por lo que '-u' en realidad no se ajusta a su propósito. –

+4

Dios mío, tienes toda la razón. Me sorprende que haya tardado tanto en darse cuenta. –

21

Esto funcionará en RedHat:

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

Actualización y no sobrescribir es algo diferente.

+1

¿Qué hace 'falso' aquí? –

+5

@FrozenFlame Responde las preguntas '-i'. – ceving

+1

Esto también funciona para busybox cp. – hackel

47

Considere el uso de rsync.

rsync -a -v src dst 

pero esto actualización archivos si son diferentes.


De acuerdo con los comentarios

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

ignorará por completo los archivos existentes.

+6

Desea agregar el indicador '-ignore-existing' para evitar que se sobrescriban los archivos existentes. – cpburnz

+6

Comando completo 'rsync -a -v --ignore-existing ' es de hecho la respuesta correcta, en lugar de 'cp -u'above. – Whitebird

+0

¿Qué hay de malo con el uso de 'cp'? – sudo

1

Alpine Linux: A continuación respuesta es sólo para el caso de una sola fila: en Alpine cp -n no funciona (y false | cp -i ... también) así que la solución de trabajo en mi caso que he encontrado es:

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

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

Cuestiones relacionadas