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 \;"
ssh
se conecta a una máquina remota y ejecuta el código encerrado entre comillas dobles""
find
busca dentro del/target/A1
directorio 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-iname
y comillas dobles para evitar abandonar el par anterior demasiado pronto.-exec
es otrofind
parámetro, utilizado para ejecutar código. En nuestro caso ejecutamosscp
y pasamos todos los resultados de búsqueda defind
ascp
con los corchetes curvos{}
.scp
copia 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.