¿Puede scp copiar directorios de forma recursiva?

573

Actualmente solo puedo copiar un solo .tararchivo. Pero, ¿cómo puedo copiar directorios de forma recursiva scp?

núcleo
fuente

Respuestas:

937

Sí, usa -r:

scp -rp sourcedirectory user@dest:/path
  • -r significa recursivo
  • -p conserva los tiempos de modificación, tiempos de acceso y modos del archivo original.

Nota: Esto crea el sourcedirectoryinterior, por /pathlo que los archivos estarán en/path/sourcedirectory

dmourati
fuente
99
Sin embargo, tenga en cuenta que esto no preservará los enlaces simbólicos.
CpnCrunch
12
Tenga en cuenta que -pr(las opciones en orden inverso) no copiarán las carpetas, sino más bien su contenido en el directorio de destino (aparentemente, el orden de las opciones es importante).
pms
172

Si bien las respuestas anteriores son técnicamente correctas, también debe considerar rsyncusarlas. rsynccompara los datos en los lados de envío y recepción con un mecanismo de diferencia para que no tenga que reenviar datos que ya se enviaron anteriormente.

Si va a copiar algo en una máquina remota más de una vez, úselo rsync. En realidad, es bueno usarlo rsynctodo el tiempo porque tiene más controles para cosas como copiar permisos y propiedad de archivos y excluir ciertos archivos o directorios. En general:

$ rsync -av /local/dir/ server:/remote/dir/

sincronizará un directorio local con un directorio remoto. Si lo ejecuta por segunda vez y el contenido del directorio local no ha cambiado, no se transferirán datos, mucho más eficiente que ejecutar scpy copiar todo cada vez.

Además, le rsyncpermite recuperarse de transferencias interrumpidas muy fácilmente, a diferencia scp.

Finalmente, las versiones modernas de rsyncpor defecto se ejecutan sobre ssh, por lo que si scpya está funcionando, rsyncdebería ser un reemplazo directo.

Phil Hollenback
fuente
1
Estoy de acuerdo rsynces más eficiente. Una cosa que no hace actualmente scpes permitir la copia entre hosts remotos (al menos sin ejecutar el cliente rsync en uno de ellos).
Cedric Knight
1
-av: v es para verbose, a para archive y es un acceso directo a -rlptgoD que implica recursivo, preservar las fechas y enlaces del propietario de los derechos. Si solo desea un uso recursivo-r
pdem
11

Opción de copia recursiva '-r' (minúscula)

scp -r

Lo que confundo con la opción de copia recursiva local regular '-R' (mayúscula)

cp -R
Tarun
fuente
1
Solo quería señalar la diferencia entre cp y scp ya que -r y -R no son lo mismo. unix.stackexchange.com/questions/18712/…
Tarun
6

La mejor manera es usar rsync sobre SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Mis opciones favoritas son -Pazvessh --delete:

  • -a: modo de archivo (incluye muchas opciones comunes predeterminadas, incluida la preservación de enlaces simbólicos)
  • -z: comprimir
  • -v: detallado: mostrar archivos
  • -P: muestra el progreso como archivos realizados / archivos restantes
  • -e ssh: hacer rsync en el protocolo ssh
  • --delete: eliminar archivos en el destino que ya no están en la fuente
mick
fuente
Todas las versiones de las rsyncque he usado se usarían sshpor defecto, por lo que -esshes poco probable que sean necesarias. Y la elección del comando utilizado para conectarse al host remoto realmente no tiene relación con la copia recursiva.
kasperd
4

Después de buscar el indicador de copia recursiva y utilizarlo con éxito gracias a esta publicación, me gustaría publicar solo una sugerencia.

Si el caso es que está copiando (recursivamente) un directorio. Tal vez si los archivos se envían comprimidos, podría ahorrar tiempo en la transferencia

Lo que hice al final fue:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Espero que esto ayude

usuario9869932
fuente
la extensión del archivo debe ser .tar.gzo .tgzya que el archivo es un archivo tar comprimido con gzip (ya -zque se usa la bandera).
anthonybell
2

Puede copiar recursivamente un directorio en un archivo comprimido con este simple comando:

ssh -p 22 [email protected]  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Por ejemplo, para copiar el contenido de /var/logpartir domain.coma ~/logs.tgzejecutar:

ssh -p 22 [email protected]  'cd /var && tar zcvf - log' > ~/logs.tgz

También puede extraer archivos en el sistema de destino mediante el uso de tuberías. Este comando copiar el contenido de /var/logpor lo domain.comque ~/destination/logen su sistema:

ssh -p 22 [email protected]  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Aunque para reflejar un directorio, probablemente deberías usar rsync...

Anubioz
fuente
1

Si prefiere pasar la contraseña del usuario como parámetro en lugar de ingresarla de forma interactiva, puede usar sshpass( sudo apt-get install -y sshpass).

Ejemplo:

sshpass -p 'remote_password' scp -rp /src/folder [email protected]:/dest/folder
Franck Dernoncourt
fuente
0

Puede usar la opción -r con el comando scp para copiar directorios de forma recursiva en cualquier sistema. Si necesita algo más, consulte el tutorial del comando scp . La opción -r significa operación recursiva en la mayoría de los comandos de Linux.

atthik
fuente
Si bien es cierto, la -ropción ya se sugirió hace años y es la respuesta aceptada.
RalfFriedl
-3

Otra opción (probablemente mejor para uso repetido) es usar NFS: consulte nfs-kernel-server y cómo configurar los recursos compartidos de NFS.

Andrei Pokrovsky
fuente
2
Esto es una completa tontería. Hay infinitos casos en los que usaría, scppero NFS no es una opción.
Sven