Linux cómo copiar pero no sobrescribir?

386

Quiero cpun 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?

mnowotka
fuente

Respuestas:

589

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
hovanessyan
fuente
33
Tenga en cuenta que esto saldrá con un error si el archivo existe. Para salir con éxito, intente cp -n source.txt destination.txt || true
galenandrew 01 de
13
@galenandrew cp -nno sale con error si el archivo existe en Ubuntu 12.04.
amit
@galenandrew confirmado. Gracias. Mi proyecto no se estaba construyendo en Xcode después de agregar un script de ejecución a mi objetivo.
Ruiz
@AaronFranke parece que sí.
Boris
93

Considera usar rsync.

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

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

Hans Ginzel
fuente
77
Desea agregar el --ignore-existingindicador para evitar que se sobrescriban los archivos existentes.
Todos los trabajadores son esenciales
77
El comando completo rsync -a -v --ignore-existing <src> <dst>es de hecho la respuesta correcta, en lugar de la cp -uanterior.
Whitebird
Si se interrumpió una copia anterior y solo se copió un archivo truncado, estoy seguro de que cp -u no lo volverá a copiar ... pero ¿rsync, con --ignore-exist? Probablemente tampoco ... así que eso los hace perfectamente equivalentes, ¿verdad?
Dagelf
rsync mantiene la marca de tiempo del archivo mientras que cp usa la hora actual (en mi experiencia)
Stefan Diabo
1
algunos servidores simplemente no tiene rsync
mebada
51
cp -n

Es lo que quieres Ver la página del manual.

bucko
fuente
@AaronFranke sí, funcionará recursivamente.
Boris el
33

Esto funcionará en RedHat:

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

Actualizar y no sobrescribir es algo diferente.

ceving
fuente
44
¿Qué hace falseaquí?
Frozen Flame
11
@FrozenFlame Responde -ipreguntas.
ceving
Obviamente, este comando no funcionará si intentas copiar más de ARG_MAX. Para solucionar este caso, consulte este enlace .
mginius
2
Obviamente, este comando no funcionará si la tierra se estrella contra el sol.
ceving
32

Para las personas que encuentran que no tienen una opción 'n' (como yo en RedHat), puede usar cp -upara 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.

Severo...
fuente
11
OP pidió no sobrescribir los archivos existentes, incluso si son más antiguos que los archivos copiados , por lo -uque en realidad no se ajusta al propósito.
Andrew Lott
44
Dios, tienes toda la razón. Me sorprende que haya tardado tanto en darse cuenta.
Grim ...
Puede que no sea lo que solicitó el OP, pero es exactamente lo que necesitaba para mi Uberspace (Centos 7). ¡Gracias!
Thomas Praxl
Me alegro de que hace seis años pudiera ayudar :-D
Grim ...
10

Alpine linux: la respuesta a continuación es solo para el caso de un solo archivo: en alpine cp -nno 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.jsel archivo no existe, entonces copiamos env.example.jsa env.js.

Kamil Kiełczewski
fuente
1

Algunas versiones de cp no tienen la opción --no-clobber . En ese caso:

  echo n | cp -vipr src/* dst
Octavio
fuente