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?
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?
Respuestas:
Tomado de la página del manual :
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
Ejemplo:
cp -n myoldfile.txt mycopiedfile.txt
cp -n source.txt destination.txt || true
cp -n
no sale con error si el archivo existe en Ubuntu 12.04.
Considera 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.
--ignore-existing
indicador para evitar que se sobrescriban los archivos existentes.
rsync -a -v --ignore-existing <src> <dst>
es de hecho la respuesta correcta, en lugar de la cp -u
anterior.
Esto funcionará en RedHat:
false | cp -i source destination 2>/dev/null
Actualizar y no sobrescribir es algo diferente.
false
aquí?
-i
preguntas.
Para las personas que encuentran que no tienen una opción 'n' (como yo en RedHat), puede usar cp -u
para escribir solo el archivo si la fuente es más nueva que la existente (o si no hay una existente).
[editar] Como se menciona en los comentarios, esto sobrescribirá los archivos más antiguos, por lo que no es exactamente lo que quería el OP. Use la respuesta de ceving para eso.
-u
que en realidad no se ajusta al propósito.
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, si env.js
el archivo no existe, entonces copiamos env.example.js
a env.js
.