Conversión/Copia de archivos en Linux

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

La línea de comandos de Linux ofrece potentes utilidades para la manipulación de archivos, y una de las herramientas más versátiles es el comando dd. Esta utilidad te permite convertir y copiar archivos con un control preciso sobre el proceso de entrada y salida. Originalmente diseñado para trabajar con unidades de cinta y otros dispositivos orientados a bloques, dd ha evolucionado hacia una herramienta multipropósito en la que los administradores de sistemas y usuarios avanzados confían para diversas tareas de gestión de datos.

En este laboratorio (LabEx), explorarás las capacidades del comando dd para convertir y copiar archivos en un entorno Linux. Aprenderás cómo realizar copias byte a byte, convertir el caso del texto durante las transferencias de archivos y comprender la sintaxis y los parámetros que convierten a dd en una potente utilidad en las operaciones de gestión de archivos.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/SystemInformationandMonitoringGroup -.-> linux/dd("File Converting/Copying") subgraph Lab Skills linux/echo -.-> lab-271263{{"Conversión/Copia de archivos en Linux"}} linux/cat -.-> lab-271263{{"Conversión/Copia de archivos en Linux"}} linux/cd -.-> lab-271263{{"Conversión/Copia de archivos en Linux"}} linux/dd -.-> lab-271263{{"Conversión/Copia de archivos en Linux"}} end

Comprensión de los conceptos básicos del comando dd

El comando dd en Linux significa "duplicador de datos" (data duplicator) y es una potente utilidad para convertir y copiar archivos. A diferencia de otros comandos de copia como cp, el comando dd permite un control más detallado sobre el proceso de copiado.

Comencemos por entender la sintaxis básica del comando dd:

dd if=<archivo de entrada> of=<archivo de salida> [opciones]

Donde:

  • if= especifica el archivo de entrada o la fuente
  • of= especifica el archivo de salida o el destino
  • [opciones] son parámetros adicionales para controlar el proceso de copiado

Ahora, veamos cómo usar dd en la práctica. Primero, creemos un archivo de muestra con el que trabajar:

  1. Navegue hasta el directorio de su proyecto:
cd ~/project
  1. Cree un archivo de texto de muestra utilizando el comando echo:
echo "This is a sample file for the dd command demonstration." > ~/project/example.txt
  1. Verifique el contenido del archivo:
cat ~/project/example.txt

Debería ver el texto: This is a sample file for the dd command demonstration.

  1. Ahora, usemos el comando dd para hacer una copia exacta de este archivo:
dd if=~/project/example.txt of=~/project/example_copy.txt

Debería ver una salida similar a esta:

0+1 records in
0+1 records out
56 bytes copied, 0.000418813 s, 133.7 kB/s

La salida muestra:

  • Registros de entrada/salida: El número de bloques completos y parciales leídos/escritos
  • Bytes copiados: La cantidad total de datos copiados
  • Tiempo transcurrido: Cuánto tiempo tomó la operación
  • Velocidad: La tasa a la que se copiaron los datos
  1. Verifique que la copia fue exitosa:
cat ~/project/example_copy.txt

Debería ver el mismo texto que en el archivo original, lo que confirma que la operación de copiado fue exitosa.

Conversión de formato de archivo con dd

Una de las características más potentes del comando dd es su capacidad para convertir datos durante el proceso de copiado. El parámetro conv= te permite especificar diversas opciones de conversión.

Exploremos cómo usar dd para convertir el caso del texto en un archivo:

  1. Primero, crea un archivo con texto en mayúsculas y minúsculas:
echo "Linux File Conversion with DD Command Example" > ~/project/mixed_case.txt
  1. Verifica el contenido del archivo:
cat ~/project/mixed_case.txt
  1. Ahora, convertamos todas las letras mayúsculas a minúsculas durante la copia:
dd if=~/project/mixed_case.txt of=~/project/lower_case.txt conv=lcase

La opción conv=lcase le indica a dd que convierta todas las letras mayúsculas a minúsculas durante la operación de copiado. Deberías ver una salida similar a:

0+1 records in
0+1 records out
46 bytes copied, 0.000401813 s, 114.5 kB/s
  1. Comprueba el resultado:
cat ~/project/lower_case.txt

Deberías ver: linux file conversion with dd command example

El comando dd también admite otras opciones de conversión:

  • ucase: Convertir minúsculas a mayúsculas
  • ascii: Convertir EBCDIC a ASCII
  • ebcdic: Convertir ASCII a EBCDIC
  • noerror: Continuar después de errores de lectura
  • sync: Rellenar cada bloque de entrada al tamaño del bloque de entrada
  1. Intentemos convertir el texto a mayúsculas:
dd if=~/project/mixed_case.txt of=~/project/upper_case.txt conv=ucase
  1. Comprueba el resultado:
cat ~/project/upper_case.txt

Deberías ver: LINUX FILE CONVERSION WITH DD COMMAND EXAMPLE

El parámetro conv= también puede aceptar múltiples opciones de conversión separadas por comas. Por ejemplo, conv=ucase,sync convertiría a mayúsculas y rellenaría cada bloque de entrada.

Uso de las opciones de tamaño de bloque y cantidad

El comando dd proporciona un control detallado sobre cómo se leen y escriben los datos a través de las opciones de tamaño de bloque (bs=) y cantidad (count=). Estos parámetros son especialmente útiles cuando se trabaja con archivos grandes o segmentos de datos específicos.

Exploremos cómo funcionan estas opciones:

  1. Primero, creemos un archivo de muestra más grande para realizar pruebas:
for i in {1..10}; do echo "This is line $i of our test file for block operations." >> ~/project/block_test.txt; done
  1. Examinemos el contenido del archivo:
cat ~/project/block_test.txt

El archivo contiene 10 líneas de texto.

  1. Ahora, usemos dd con las opciones de tamaño de bloque y cantidad para copiar solo una parte del archivo:
dd if=~/project/block_test.txt of=~/project/partial_copy.txt bs=10 count=5

En este comando:

  • bs=10 establece el tamaño de bloque en 10 bytes
  • count=5 especifica que solo se deben leer y escribir 5 bloques

Esto significa que solo se copiarán los primeros 50 bytes (10 bytes × 5 bloques) del archivo de entrada. Deberías ver una salida similar a:

5+0 records in
5+0 records out
50 bytes copied, 0.000412813 s, 121.1 kB/s
  1. Comprobemos el contenido de la copia parcial:
cat ~/project/partial_copy.txt

Deberías ver solo los primeros 50 bytes del archivo original.

La opción de tamaño de bloque puede utilizar los siguientes sufijos:

  • c para bytes (1 byte)
  • w para palabras (2 bytes)
  • b para bloques (512 bytes)
  • k para kilobytes (1024 bytes)
  • M para megabytes (1024*1024 bytes)
  • G para gigabytes (102410241024 bytes)
  1. Intentemos usar un tamaño de bloque diferente con el sufijo k:
dd if=~/project/block_test.txt of=~/project/kb_copy.txt bs=1k count=1

Este comando copia 1 kilobyte (1024 bytes) de datos, lo cual debería ser suficiente para capturar todo el archivo de prueba ya que es relativamente pequeño.

  1. Verifiquemos el contenido copiado:
cat ~/project/kb_copy.txt

Deberías ver que se copió todo el archivo porque su tamaño es menor a 1 kilobyte.

El uso de las opciones de tamaño de bloque y cantidad se vuelve especialmente importante cuando se trata con imágenes de disco, archivos de copia de seguridad grandes o cuando se necesita extraer porciones específicas de un archivo.

Opciones avanzadas del comando dd

Más allá de los parámetros básicos, el comando dd ofrece varias opciones avanzadas que brindan un control adicional sobre el proceso de copiado. Exploremos algunas de las más útiles:

La opción status

La opción status= controla cómo dd muestra su progreso. Esto es especialmente útil cuando se copian archivos grandes.

  1. Creemos otro archivo de muestra:
for i in {1..20}; do echo "Line $i: The dd command provides detailed status information." >> ~/project/status_example.txt; done
  1. Usemos dd con la opción status=progress:
dd if=~/project/status_example.txt of=~/project/status_copy.txt bs=1k status=progress

Con la opción status=progress, dd mostrará información de progreso en tiempo real durante la operación de copiado.

La opción status admite varios valores:

  • none: No mostrar información
  • noxfer: Mostrar todo excepto las estadísticas de transferencia
  • progress: Mostrar estadísticas periódicas de transferencia

Las opciones skip y seek

Las opciones skip= y seek= te permiten omitir bloques en los archivos de entrada y salida respectivamente, lo cual es útil para apuntar a secciones específicas de los archivos.

  1. Usemos skip para comenzar a copiar desde la mitad de nuestro archivo de prueba:
dd if=~/project/block_test.txt of=~/project/skipped_copy.txt bs=10 skip=10

La opción skip=10 le indica a dd que omita los primeros 10 bloques (cada uno de 10 bytes de tamaño) del archivo de entrada antes de comenzar a copiar.

  1. Comprobemos el resultado:
cat ~/project/skipped_copy.txt

Deberías ver que se ha omitido el inicio del archivo.

  1. Ahora usemos la opción seek para dejar espacio al principio del archivo de salida:
dd if=~/project/block_test.txt of=~/project/seek_example.txt bs=10 seek=5

La opción seek=5 instruye a dd a omitir 5 bloques al principio del archivo de salida antes de escribir cualquier dato.

  1. Examinemos el archivo de salida:
hexdump -C ~/project/seek_example.txt | head

Esto te mostrará que el archivo comienza con 50 bytes de ceros (5 bloques de 10 bytes) antes de que comience los datos reales.

Las opciones iflag y oflag

Las opciones iflag= y oflag= controlan el manejo especial de los archivos de entrada y salida:

dd if=~/project/block_test.txt of=~/project/direct_copy.txt bs=4k iflag=direct,fullblock

Algunas banderas comunes incluyen:

  • direct: Usar E/S directa para los datos
  • dsync: Usar E/S sincronizada para los datos
  • sync: Usar E/S sincronizada para los datos y los metadatos
  • nonblock: Usar E/S no bloqueante
  • fullblock: Acumular bloques completos de entrada

Estas opciones avanzadas convierten a dd en una herramienta versátil para diversas tareas del sistema, incluyendo la creación de copias de seguridad, la clonación de discos y la recuperación de datos.

Resumen

En este laboratorio, has explorado el poderoso comando dd en Linux, que ofrece capacidades versátiles de conversión y copiado de archivos.

Has aprendido cómo:

  1. Utilizar la sintaxis básica del comando dd con los parámetros if= (archivo de entrada) y of= (archivo de salida) para crear copias exactas de archivos.

  2. Aplicar opciones de conversión con el parámetro conv= para transformar el contenido de los archivos durante la copia, como convertir texto entre mayúsculas y minúsculas.

  3. Controlar el proceso de lectura y escritura utilizando las opciones de tamaño de bloque (bs=) y cantidad (count=), lo que te permite especificar exactamente cuántos datos se deben copiar y en qué tamaño de fragmentos.

  4. Utilizar opciones avanzadas como status=progress para monitorear el proceso de copiado, skip= y seek= para apuntar a secciones específicas de los archivos y banderas para controlar el manejo especial de E/S.

El comando dd es una herramienta poderosa en el kit de herramientas del administrador de Linux. Aunque puede parecer complejo al principio, su flexibilidad lo hace invaluable para tareas que van desde simples conversiones de archivos hasta operaciones complejas del sistema, como crear imágenes de disco, borrar unidades o recuperar datos de almacenamiento dañado.

Recuerda que dd puede ser peligroso si se utiliza incorrectamente, ya que no proporciona mensajes de confirmación antes de sobrescribir archivos o discos. Siempre verifica dos veces tus parámetros, especialmente cuando trabajes con discos del sistema o datos importantes.