Copie archivos en Linux, evite la copia si los archivos existen en el destino

32

Necesito copiar una carpeta / home / user de un disco duro a otro. Tiene 100.000 archivos y alrededor de 10G de tamaño.

yo suelo

cp -r /origin /destination

a veces recibo algunos errores debido a enlaces rotos, permisos, etc. Así que soluciono el error y necesito comenzar de nuevo la copia.

Me pregunto cómo podría decirle al comando "cp", una vez que intente copiar nuevamente, no copiar archivos nuevamente si existen en la carpeta de destino.

Abre el camino
fuente
2
No nos cp. Use rsync en su lugar.
William Pursell

Respuestas:

22

cp -R -u -p /source /destination

La -u( o--update ) bandera hace exactamente esto:

Desde la página del manual para cp:

-u, --update

copiar solo cuando el archivo SOURCE es más nuevo que el archivo de destino o cuando falta el archivo de destino

usuario31894
fuente
66
Para, literalmente, solo copiar archivos que no existen y no actualizar los existentes, yes n | cp -i /source/* /destination 2>/dev/null
sventechie
44
-u, - actualizar copia solo cuando el archivo SOURCE es más nuevo que el archivo de destino o cuando falta el archivo de destino -u, --update copiar solo cuando el archivo SOURCE es más nuevo que el archivo de destino o cuando falta el archivo de destino -p igual que --preserve = modo, propiedad, marcas de tiempo --preserve [= ATTR_LIST] preserva los atributos especificados (por defecto: modo, propiedad, marcas de tiempo), si es posible atributos adicionales: contexto, enlaces, xattr, todos
Covich
51

Solo úsalo cp -n <source> <dest>.

Desde la página del manual :

-n, --no-clobber

NO sobrescriba un archivo existente (anula una opción -i anterior)

Balmipour
fuente
77
Esta es la única respuesta verdadera a la pregunta.
sebix
20

rsync -aq /src /dest

Además de copiar solo los archivos más nuevos, incluso solo copiará las partes más nuevas de los archivos si el archivo ha cambiado. Está destinado a copiar a través de enlaces de red donde desea minimizar la cantidad de datos, pero también funciona muy bien a nivel local.

Martin Beckett
fuente
No puedo agregar `` formato a tu publicación porque solo tiene dos caracteres. ¿Qué le parecería editar esto y agregar `` caracteres alrededor de su comando?
culix
4

Busque la opción "-u" para el cpcomando.

Puntiagudo
fuente
2
No estoy de acuerdo con que usar -u sea una buena idea. -u copia solo cuando el origen es más nuevo o falta el destino. El problema del póster original fue causado por la ruptura de la copia del archivo por cualquier motivo. OP, por lo tanto, tendría un archivo medio escrito que no se actualizó al volver a ejecutar la copia. ¡Ese archivo puede ser importante para alguien! rsync resuelve este problema.
hazymat
2

Todas las respuestas anteriores son correctas, pero si lo hace de forma recursiva, entonces

deberías hacer:

 cp -rn SOURCE_PATH DESTINATION_PATH
grepit
fuente
1

Debería copiar como root para mantener los permisos / propiedad

# cp -au

También mira rsync

pixelbeat
fuente
1

Solución POSIX

Otras respuestas de uso -u u -nopciones de cp. Ninguno de estos es requerido por POSIX ; ni es rsyncde otra respuesta más; ni se yesusa en uno de los comentarios.

Aún así podemos reproducirnos yes ncon un whilebucle. Esto lleva a la siguiente solución POSIX:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null
Kamil Maciorowski
fuente
0

Utilizar cp -rn <sourcedirname>/. <destdirname>

El interruptor r hace que la copia sea recursiva sobre los directorios.

El interruptor n (versión larga no-clobber) garantiza que los archivos existentes nunca se sobrescriban.

El ' /.' después del nombre de origen asegura que no se convierta en un subdirectorio debajo del nombre de nombre en lugar de que todos los contenidos del primero se copien en el segundo.

taatparya
fuente