Transferencia de archivos con computadoras remotas
Última actualización: 2026-03-31 | Mejora esta página
Hoja de ruta
Preguntas
- ¿Cómo transfiero archivos hacia (y desde) el clúster?
Objetivos
- Transferir archivos hacia y desde un clúster de cómputo.
Trabajar en una computadora remota no es muy útil si no podemos obtener archivos hacia o desde él. Hay varias opciones para transferir datos entre recursos de cómputo usando herramientas CLI y GUI, algunas de las cuales cubriremos.
Descargar archivos de la lección desde Internet
Una de las formas más directas de descargar archivos es usar
curl o wget. Uno de estos suele estar
instalado en la mayoría de las shells de Linux, en la terminal de macOS
y en GitBash. Cualquier archivo que pueda descargarse en tu navegador
web mediante un enlace directo puede descargarse usando
curl o wget. Esta es una forma rápida de
descargar conjuntos de datos o código fuente. La sintaxis de estos
comandos es
wget [-O new_name] https://some/link/to/a/filecurl [-o new_name] https://some/link/to/a/file
Pruébalo descargando algo del material que usaremos más adelante, desde una terminal en tu máquina local, usando la URL del código base actual:
https://github.com/hpc-carpentry/amdahl/tarball/main
Descargar el “tarball”
La palabra “tarball” en la URL anterior se refiere a un formato de
archivo comprimido comúnmente usado en Linux, que es el sistema
operativo en el que corre la mayoría de las máquinas de los clústeres
HPC. Un tarball es muy parecido a un archivo .zip. La
extensión real del archivo es .tar.gz, que refleja el
proceso de dos etapas usado para crear el archivo: los archivos o
carpetas se combinan en un solo archivo con tar, que luego
se comprime con gzip, por lo que la extensión del archivo
es “tar-punto-g-z”. Es un trabalenguas, así que la gente suele decir “el
tarball xyz”.
También puedes ver la extensión .tgz, que es solo una
abreviatura de .tar.gz.
De forma predeterminada, curl y wget
descargan archivos con el mismo nombre que la URL: en este caso,
main. Usa uno de los comandos anteriores para guardar el
tarball como amdahl.tar.gz.
Después de descargar el archivo, usa ls para verlo en tu
directorio de trabajo:
Archivar archivos
Uno de los mayores desafíos que enfrentamos al transferir datos entre sistemas HPC remotos es el gran número de archivos. Existe una sobrecarga al transferir cada archivo individual y, cuando transferimos grandes cantidades de archivos, esas sobrecargas se combinan y ralentizan nuestras transferencias en gran medida.
La solución a este problema consiste en archivar múltiples
archivos en un número menor de archivos, pero más grandes, antes de
transferir los datos. Esto con el fin de mejorar la eficiencia de la
transferencia. En ocasiones, combinaremos la creación de archivos con
compresión para reducir la cantidad de datos a transferir y así
acelerar el proceso. El comando de archivado más común que se utiliza en
un clúster HPC (Linux) es tar.
tar puede usarse para combinar archivos y carpetas en un
solo archivo y, opcionalmente, comprimir el resultado. Veamos el archivo
que descargamos del sitio de la lección, amdahl.tar.gz.
La parte .gz significa gzip, que es una
biblioteca de compresión. Es común (¡aunque no necesario!) que este tipo
de archivo pueda interpretarse leyendo su nombre: parece que alguien
tomó archivos y carpetas relacionados con algo llamado “amdahl”, los
empaquetó en un solo archivo con tar, y luego comprimió ese
archivo con gzip para ahorrar espacio.
Veamos si ese es el caso, sin descomprimir el archivo.
tar imprime la “tabla de contenidos” con
la opción -t, para el archivo especificado con la opción
-f seguida del nombre del archivo. Ten en cuenta que puedes
concatenar las dos opciones: escribir -t -f es
intercambiable con escribir -tf junto. Sin embargo, el
argumento que sigue a -f debe ser un nombre de archivo, así
que escribir -ft no funcionará.
BASH
[you@laptop:~]$ tar -tf amdahl.tar.gz
hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py
Este ejemplo de salida muestra una carpeta que contiene algunos
archivos, donde 46c9b4b es un hash de commit de git de 8 caracteres
que cambiará cuando el material fuente se actualice.
Ahora descomprimamos el archivo. Ejecutaremos tar con
algunas opciones comunes:
-
-xpara extraer el archivo -
-vpara salida verbosa -
-zpara compresión gzip -
-f «tarball»para el archivo a descomprimir
Extraer el archivo
Usando las opciones anteriores, descomprime el tarball del código
fuente en un nuevo directorio llamado “amdahl” usando
tar.
SALIDA
hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py
Ten en cuenta que no necesitamos escribir -x -v -z -f,
gracias a la concatenación de opciones, aunque el comando funciona igual
de cualquier forma, siempre y cuando la lista concatenada termine con
f, porque la siguiente cadena debe especificar el nombre
del archivo a extraer.
La carpeta tiene un nombre poco conveniente, así que cambiémoslo por algo más práctico.
Verifica el tamaño del directorio extraído y compáralo con el tamaño
del archivo comprimido, usando du para “uso de disco”
(disk usage).
BASH
[you@laptop:~]$ du -sh amdahl.tar.gz
8.0K amdahl.tar.gz
[you@laptop:~]$ du -sh amdahl
48K amdahl
Los archivos de texto (incluyendo el código fuente de Python) se comprimen bien: ¡el “tarball” es una sexta parte del tamaño total de los datos en bruto!
Si quieres invertir el proceso, comprimiendo datos en bruto en lugar
de extraerlos, usa la opción c en lugar de x,
indica el nombre del archivo y luego proporciona un directorio para
comprimir:
SALIDA
amdahl/
amdahl/.github/
amdahl/.github/workflows/
amdahl/.github/workflows/python-publish.yml
amdahl/.gitignore
amdahl/LICENSE
amdahl/README.md
amdahl/amdahl/
amdahl/amdahl/__init__.py
amdahl/amdahl/__main__.py
amdahl/amdahl/amdahl.py
amdahl/requirements.txt
amdahl/setup.py
Si proporcionas amdahl.tar.gz como nombre de archivo en
el comando anterior, tar actualizará el tarball existente
con cualquier cambio que hayas hecho en los archivos. Eso significaría
agregar la nueva carpeta amdahl a la carpeta
existente (hpc-carpentry-amdahl-46c9b4b) dentro
del tarball, ¡duplicando el tamaño del archivo!
Trabajar con Windows
Cuando transfieres archivos de texto desde un sistema Windows a un sistema Unix (Mac, Linux, BSD, Solaris, etc.), esto puede causar problemas. Windows codifica sus archivos de forma ligeramente diferente a Unix y agrega un carácter extra en cada línea.
En un sistema Unix, cada línea de un archivo termina con un
\n (nueva línea). En Windows, cada línea termina con un
\r\n (retorno de carro (carriage return) + nueva
línea). Esto a veces causa problemas.
Aunque la mayoría de los lenguajes de programación y software
modernos manejan esto correctamente, en algunos casos raros puedes
encontrarte con un problema. La solución es convertir un archivo de
codificación Windows a Unix con el comando dos2unix.
Puedes identificar si un archivo tiene finales de línea de Windows
con cat -A filename. Un archivo con finales de línea de
Windows tendrá ^M$ al final de cada línea. Un archivo con
finales de línea de Unix tendrá $ al final de una
línea.
Para convertir el archivo, simplemente ejecuta
dos2unix filename. (De forma contraria, para convertir de
nuevo a formato Windows, puedes ejecutar
unix2dos filename.)
Transferir archivos y carpetas individuales con
scp
Para copiar un archivo individual hacia o desde el clúster, podemos
usar scp (“secure copy”). La sintaxis puede ser un
poco compleja para usuarios nuevos, pero la desglosaremos. El comando
scp es pariente del comando ssh que usamos
para acceder al sistema y puede usar el mismo mecanismo de autenticación
con clave pública.
Para subir a otra computadora, el comando plantilla es
en el que @ y : son separadores de campos y
remote_destination es una ruta relativa a tu directorio
personal remoto, o un nuevo nombre de archivo si deseas cambiarlo, o
tanto una ruta relativa como un nuevo nombre de archivo. Si no
tienes una carpeta específica en mente, puedes omitir
remote_destination y el archivo se copiará a tu directorio
personal en la computadora remota (con su nombre original). Si incluyes
un remote_destination, ten en cuenta que scp
interpreta esto de la misma manera que cp al hacer copias
locales: si existe y es una carpeta, el archivo se copia dentro de la
carpeta; si existe y es un archivo, el archivo se sobrescribe con el
contenido de local_file; si no existe, se asume que es un
nombre de destino para local_file.
Sube el material de la lección a tu directorio personal remoto así:
¿Por qué no descargar directamente en HPC Carpentry’s Cloud Cluster?
La mayoría de los clústeres de computadoras están protegidos del Internet abierto por un firewall. Para mayor seguridad, algunos están configurados para permitir tráfico entrante, pero no saliente. Esto significa que una persona usuaria autenticada puede enviar un archivo a una máquina del clúster, pero una máquina del clúster no puede recuperar archivos desde la máquina de una persona usuaria ni desde Internet abierto.
Intenta descargar el archivo directamente. Ten en cuenta que puede fallar, y ¡está bien!
¿Por qué no descargar directamente en HPC Carpentry’s Cloud Cluster? (continued)
¿Funcionó? Si no, ¿qué muestra la terminal sobre lo que pasó?
Transferir un directorio
Para transferir un directorio completo, añadimos la opción
-r de “recursivo”: esto copia el elemento
especificado, todos los elementos que contiene y todos los elementos de
sus subdirectorios… hasta llegar al final del árbol de directorios que
tiene como raíz la carpeta que indicaste.
Precaución
Para un directorio grande, ya sea por tamaño o número de archivos,
copiar con -r puede tardar mucho en completarse.
Al usar scp, quizá hayas notado que un :
siempre sigue al nombre de la computadora remota. Una cadena
después de : especifica el directorio remoto al
que deseas transferir el archivo o carpeta, incluyendo un nuevo nombre
si deseas renombrar el material remoto. Si dejas este campo en blanco,
scp usa por defecto tu directorio personal y el nombre del
material local a transferir.
En computadoras Linux, / es el separador en rutas de
archivos o directorios. Una ruta que comienza con / se
llama absoluta, ya que no puede haber nada por encima de la
raíz /. Una ruta que no comienza con / se
llama relativa, ya que no está anclada a la raíz.
Si quieres subir un archivo a una ubicación dentro de tu directorio
personal, que suele ser el caso, entonces no necesitas un /
inicial. Después de : puedes escribir la ruta de
destino relativa a tu directorio personal. Si tu directorio personal
es el destino, puedes dejar el campo de destino en blanco o
escribir ~, el atajo para tu directorio personal, por
completitud.
Con scp, una barra final en el directorio de destino es
opcional y no tiene efecto. Una barra final en un directorio de origen
es importante para otros comandos, como rsync.
Una nota sobre rsync
A medida que ganas experiencia transfiriendo archivos, es posible que
el comando scp te resulte limitado. La herramienta rsync proporciona funciones
avanzadas para transferir archivos y normalmente es más rápida que
scp y sftp (ver más abajo). Es especialmente
útil para transferir archivos grandes y/o muchos archivos, y para
sincronizar el contenido de carpetas entre computadoras.
La sintaxis es similar a scp. Para transferir a
otra computadora con las opciones más usadas:
Las opciones son:
-
-a(archivo) para preservar marcas de tiempo, permisos y carpetas, entre otras cosas; implica recursión -
-v(verboso) para obtener salida detallada y ayudar a monitorear la transferencia -
-P(partial/progress) para conservar archivos parcialmente transferidos en caso de interrupción y también mostrar el progreso de la transferencia.
Para copiar un directorio de forma recursiva, podemos usar las mismas opciones:
Tal como está escrito, esto colocará el directorio local y su contenido dentro de tu directorio personal en el sistema remoto. Si se agrega una barra final al origen, no se creará un nuevo directorio correspondiente al directorio transferido, y el contenido del directorio de origen se copiará directamente en el directorio de destino.
Para descargar un archivo, simplemente cambiamos el origen y el destino:
Las transferencias de archivos con scp y
rsync usan SSH para cifrar los datos enviados por la red.
Así que, si puedes conectarte por SSH, podrás transferir archivos. Por
defecto, SSH usa el puerto de red 22. Si se usa un puerto SSH
personalizado, tendrás que especificarlo con la opción adecuada,
frecuentemente -p, -P o --port.
Revisa --help o la página man si no estás
seguro.
BASH
[you@laptop:~]$ man rsync
[you@laptop:~]$ rsync --help | grep port
--port=PORT specify double-colon alternate port number
See http://rsync.samba.org/ for updates, bug reports, and answers
[you@laptop:~]$ rsync --port=768 amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:
(Ten en cuenta que este comando fallará, ya que el puerto correcto en este caso es el predeterminado: 22.)
Transferir archivos de forma interactiva con FileZilla
FileZilla es un cliente multiplataforma para descargar y subir
archivos hacia y desde una computadora remota. Es totalmente a prueba de
fallos y siempre funciona bastante bien. Usa el protocolo
sftp. Puedes leer más sobre el uso del protocolo
sftp en la línea de comandos en la discusión de la lección.
Descarga e instala el cliente FileZilla desde https://filezilla-project.org. Después de instalar y abrir el programa, deberías ver una ventana con un explorador de archivos de tu sistema local en el lado izquierdo de la pantalla. Cuando te conectes al clúster, tus archivos del clúster aparecerán en el lado derecho.
Para conectarte al clúster, solo necesitas ingresar tus credenciales en la parte superior de la pantalla:
- Host:
sftp://cluster.hpc-carpentry.org - User: Tu nombre de usuario del clúster
- Password: Tu contraseña del clúster
- Port: (deja en blanco para usar el puerto predeterminado)
Haz clic en “Quickconnect” para conectar. Deberías ver tus archivos remotos en el lado derecho de la pantalla. Puedes arrastrar y soltar archivos entre el lado izquierdo (local) y el derecho (remoto) de la pantalla para transferirlos.
Por último, si necesitas mover archivos grandes (típicamente mayores
a un gigabyte) de una computadora remota a otra computadora remota,
entra por SSH a la computadora que hospeda los archivos y usa
scp o rsync para transferirlos a la otra. Esto
será más eficiente que usar FileZilla (o aplicaciones relacionadas) que
copiarían desde el origen a tu máquina local y luego a la máquina de
destino.
-
wgetycurl -Odescargan un archivo desde Internet. -
scpyrsynctransfieren archivos hacia y desde tu computadora. - Puedes usar un cliente SFTP como FileZilla para transferir archivos con una GUI.