Usando scp para transferir una lista de archivos .txt


4

Tengo 1,6 millones de archivos en el servidor A, y solo alrededor de 20k de ellos necesitan llegar al servidor B. El destino, el servidor B, está en el alojamiento compartido GoDaddy, por lo que estoy limitado a scp para transferir muchos archivos a la vez.

Me gustaría generar un archivo .txt de esos 20k + archivos a partir de una consulta SQL, luego alimentar esa lista en scp. ¿Hay alguna opción para hacerlo?

cat /proc/version me da Linux version 2.6.32-531.23.3.lve1.2.65.el6.x86_64 (mockbuild@koji.cloudlinux.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Tue Aug 19 10:37:27 EDT 2014


Entonces, ¿los nombres de los archivos se almacenan en una base de datos SQL? ¿También está disponible rsync? Esto sería preferible. Si el SCP muere en el medio de la transferencia, tendrá que averiguar qué se transfirió y qué no. rsync hará esa parte por usted.
Nathan Powell

@NathanPowell rsyncfue mi primer pensamiento también, pero GoDaddy tiene muchas bloqueos en la instalación de nuevo software a través de su SSH. Sí, las rutas de los archivos están actualmente en una base de datos SQL, pero puedo extraerlas fácilmente a un archivo de texto.
Morgan Delaney

Otra forma simple es crear enlaces a esos archivos en un nuevo directorio. Luego, use rsync -Lpara copiar los archivos al servidor remoto. El principal inconveniente es que debe limpiar el directorio después. No creo que esta sea una respuesta formal a esta pregunta, por eso agregué como comentario.
lepe

Respuestas:


7

si ya tiene el archivo de texto creado, haga lo siguiente

cat /location/file.txt | xargs -i scp {} user@server:/location

esto irá línea por línea de la salida del archivo.txt y ejecutará el comap scp por línea; Espero que esto ayude.


Eso se está acercando mucho, ¡gracias! Sin embargo, me gustaría tener este proceso sin intervención, y me temo que si se ejecuta línea por línea, solicitará mi contraseña en el servidor remoto cada línea. Probé las claves SSH pero sin éxito, tal vez simplemente no lo estaba haciendo bien. ¿Serían las claves SSH mi única opción para que ese proceso no se realice?
Morgan Delaney

¡Esto funcionó maravillosamente! Lo que hice en lugar de xargsen la scpllamada fue usarlo xargsen un cpservidor remoto para aislar los archivos en un directorio, algo así como: cat files.txt | xargs -l bash -c 'cp $0 $1'luego usé un solo scpcomando para extraer ese directorio. ¡Gracias!
Morgan Delaney

1

La respuesta proporcionada funciona muy bien. Solía xargs -aenviar el archivo a estándar. Luego combiné eso con la respuesta original decat /location/file.txt | xargs -i scp {} user@server:/location

Mi respuesta:

xargs -a /location/file.txt | xargs -i scp {} user@server:/location

¿Cuál es el beneficio de xargs -ausar en exceso cat? cates más portátil ya que la disponibilidad de -afor xargsdepende del sistema.
ephsmith

1

Las respuestas anteriores requieren que se autentique para cada archivo transferido. SCP se ejecuta sobre SSH y GoDaddy proporciona acceso a otros comandos a través de SSH, como tar. Como tal, el mejor método es usar tar con ssh a través de:

tar -T <file> -cf - | ssh <user>@<host> "tar -C <dir> -xvf -"

Si la lista de archivos está en STDIN, puede hacer lo siguiente en su lugar: Nota: cat se usa aquí para generar STDIN solamente

cat <file> | tar -T - -cf - | ssh <user>@<host> "tar -C <dir> -xvf -"

Para reducir el tiempo de transferencia a costa de un tiempo de procesamiento adicional, puede agregar -z o -j a ambos comandos tar para habilitar la compresión gzip o bzip respectivamente.


0

Quería hacer lo mismo para la lista de carpetas y ninguna de las respuestas que utilicé xargsfuncionó para mí. Al final resolví esto simplemente con:

scp -r user@server:/location/{"$(cat folder_list.txt | tr '\n' ',' | sed 's/,$//')"} .

Donde paso mi lista de archivos a la expansión de shell. Creo que esto puede ser útil para cualquiera que busque una solución alternativa.


0

Considere rsync como una alternativa, que tiene soporte ssh incorporado y admite la lectura de una lista de archivos usando--files-from .

Ejemplo:

rsync -av --progress --partial-dir=/tmp --files-from=file_list.txt . me@example.com:/dest

Ventajas sobre scp:

Ver también:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.