¿Cómo puedo obtener el comando scp para sobrescribir la carpeta de destino?

41

Estoy usando el comando scp para copiar algunos archivos a una PC remota, como lo hace con scp :)

Observo que el comportamiento predeterminado de una copia scp para archivos es sobrescribir cualquier archivo existente. Ahora quiero copiar una carpeta, así que básicamente hago lo mismo:

scp -r <source_path> user@myOtherPc:<dest_path>

Donde las partes en <> son las rutas de mi carpeta. Sin embargo, cuando ejecuto esto, aparece el mensaje "el archivo existe". ¿Hay alguna forma de evitar esto? algún tipo de sobreescritura forzada?

Gracias forraje

code_fodder
fuente
2
¿Podrías dar algunos ejemplos de camino? No realizo para reproducir esto en mi sistema. Además, ¿ha verificado los permisos de archivo?
Levans
¿Le da alguna información útil si utiliza el modo detallado? -v. Además, ¿está utilizando una ruta absoluta o relativa en el lado de destino? Creo que si la carpeta de destino ya existe, va a crear la ruta de origen dentro de la carpeta de destino en lugar de sobrescribir ( testdir/testdir)
beroe
2
Es extraño que entiendas esto. Supuestamente scp no tiene noclobber ...
beroe
1
@Levans No verifiqué los permisos, acabo de echar un vistazo y creo que puede que tengas razón. Eliminé todo en el área de destino y comencé de nuevo usando solo el comando "scp" y el usuario "root" y pude copiar los archivos / carpetas varias veces :) ... No estoy 100% seguro de qué problema de permiso tengo tenido, pero ahora tengo un "mango" en el tema, probablemente, se me ocurre que, gracias
code_fodder
1
@beroe Sí, esto es lo que también pensé ... me confundió, pero creo que he cometido algún tipo de error de usuario aquí con los permisos, todavía no soy un experto en Linux :( Pero intentaré la verbosidad la próxima vez que tenga un problema como ese para obtener más información, gracias. También he notado que a veces aparece la "carpeta dentro de la carpeta" ... pero ese es otro problema: o
code_fodder

Respuestas:

27

Como se dijo antes, scp felizmente sobrescribe cualquier archivo que ya esté presente.

El problema de "el archivo existe" solo puede ocurrir cuando tiene algún otro proceso (como un proceso scp concurrente u otra cosa) escribiendo carpetas y archivos en el mismo destino. Considere usar rsync en su lugar.

nicolasochem
fuente
1
Solo agregaría: ... siempre que tenga acceso de escritura a ese archivo ...
SDsolar
pero para las carpetas, ¿combina o reemplaza la carpeta?
Dr_Hope
5

Al igual que Levans, no he podido replicar esto, pero ¿has considerado usar rsync sobre ssh? Si está copiando una gran cantidad de archivos, rsync puede ser una mejor opción que scp. Hay una serie de buenas guías en línea, como estas:

http://troy.jdmz.net/rsync/index.html https://calomel.org/rsync_tips.html

Ese primer enlace se ocupa de las copias de seguridad automáticas a través de cron, por lo que algunas de las instrucciones (como crear una clave ssh sin una frase de contraseña) pueden no ser relevantes para usted.

Ben
fuente
Interesante, no sabía que puede usar rsync de esa manera ... solo eché un vistazo rápido a la página de manual y parece que puede usarlo de una manera muy similar a scp con <source_path> y <user @ host: dest_path> parámetros. No estoy 100% seguro de que eso sea lo que quiero, ya que siempre quiero copiar / sobrescribir sin importar el estado de lo que está en el destino, pero aún así es una buena idea :)
code_fodder
Sí, podría valer la pena jugar porque debería copiar el archivo si se ha cambiado (o la parte del archivo que se ha cambiado, tendría que volver a comprobarlo y estoy un poco cansado) ahora).
Ben
jaja .... no se preocupe acerca de la comprobación, yo puedo hacer eso ... pero gracias por la info :)
code_fodder
Ah, genial, puedo dejar de mirar cerillas como un medio para abrir los párpados. ;)
Ben
1
Esto puede funcionar, pero es un poco como usar un mazo para aplastar una mosca. ;-)
SDsolar
3

Recibirá este mensaje de error si el directorio de destino ya contiene un archivo con el mismo nombre que el directorio de origen que está intentando transferir. No puede tener un archivo con el mismo nombre que un directorio en el mismo directorio.

EvR2f
fuente