Usando scp para obtener todos los archivos en múltiples directorios

Usando scp para obtener todos los archivos en múltiples directorios

Tengo una estructura de directorios que se parece a A1/B1/C1/files111*, A1/B1/C2/files112*, A1/B2/C1/files121*, A1/B2/C2/files122*etc. para que todos los archivos en todos los directorios sean únicos. ¿Hay alguna forma de utilizar scp (o alguna otra herramienta) para extraer todos los archivos del terminal files###*a la vez?

Respuesta1

Como no especificó esto en la pregunta, supondré que la estructura del directorio es remota y la desea local.

Lo que debe hacer es usar comodines, pero escaparlos en el lado del cliente, para que su shell local los ignore y los pase. Combine eso con una bandera recursiva ( -r), y debería funcionar como lo desea:

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

La parte importante es la barra invertida, ya que hace que su shell local ignore el asterisco y lo pase. Esto debería permitirle extraer todo files*desde el control remoto, incluidos los subdirectorios. También extraerá cualquier archivo real cuyo nombre comience con files*.

Respuesta2

Primero debe considerar qué desea que suceda con los archivos que se copian de esta manera y cómo esto puede afectar futuras operaciones de copia. ¿Se quedarán allí? ¿Serán eliminados? ¿Archivado? Una vez que sepa esto, puede crear su comando de copia y luego realizar las operaciones de limpieza necesarias. Aquí hay un script de muestra que primero copia todos los archivos existentes y luego los elimina del servidor remoto.

Existe el riesgo de que los archivos cambien entre las operaciones de copiar y eliminar, por lo que primero los movería a un directorio temporal, luego los copiaría y eliminaría desde allí, permitiendo que el directorio de trabajo continúe con su funcionamiento normal.

También crearía un trabajo cron para recuperar estos archivos automáticamente a la misma hora todos los días y agregaría algunas comprobaciones de cordura para garantizar que las operaciones se completen correctamente.

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done

Respuesta3

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • sshse conecta a una máquina remota y ejecuta el código encerrado entre comillas dobles""
  • findbusca dentro del /target/A1directorio todos los archivos que contienen la palabra clave "archivos". Tenga en cuenta que necesita barras invertidas para el parámetro de búsqueda que no distingue entre mayúsculas y minúsculas -inamey comillas dobles para evitar abandonar el par anterior demasiado pronto.
  • -execes otro findparámetro, utilizado para ejecutar código. En nuestro caso ejecutamos scpy pasamos todos los resultados de búsqueda de finda scpcon los corchetes curvos {}.
  • scpcopia los archivos encontrados en su máquina local o en cualquier otra máquina.

Esto funcionó en mi configuración de prueba ya que intercambié las claves públicas para usar la autenticación sin contraseña.

información relacionada