Recientemente me di cuenta de que podemos usar cat
tanto como dd
, y en realidad es más rápido que dd
Sé que dd
fue útil en el manejo de cintas donde el tamaño del bloque realmente importaba en la corrección, no solo en el rendimiento. En estos días, sin embargo, hay situaciones en las que dd
puede hacer algo cat
¿no puedo? (Aquí consideraría irrelevante una diferencia de rendimiento de menos del 20 %).
¡Ejemplos concretos estaría bien!
Respuesta aceptada:
En apariencia, dd
es una herramienta de un sistema operativo de IBM que ha conservado su aspecto extraño (su paso de parámetros), que realiza algunas funciones muy poco utilizadas (como conversiones de EBCDIC a ASCII o inversión de endianness... no es una necesidad común hoy en día).
Solía pensar que dd
era más rápido para copiar grandes bloques de datos en el mismo disco (debido al uso más eficiente del almacenamiento en búfer), pero esto no es cierto, al menos en los sistemas Linux actuales.
Creo que algo de dd
Las opciones de son útiles cuando se trata de cintas, donde la lectura se realiza realmente en bloques (los controladores de cinta no ocultan los bloques en el medio de almacenamiento como lo hacen los controladores de disco). Pero no sé los detalles.
Una cosa dd
puede hacer eso no puede (fácilmente) ser hecho por ninguna otra herramienta POSIX es tomar los primeros N bytes de un arroyo Muchos sistemas pueden hacerlo con head -c 42
, pero head -c
, aunque común, no está en POSIX (y no está disponible hoy, por ejemplo, en OpenBSD). (tail -c
es POSIX). Además, incluso donde head -c
existe, es posible que lea demasiados bytes de la fuente (porque usa el almacenamiento en búfer de stdio internamente), lo cual es un problema si está leyendo desde un archivo especial donde solo leer tiene un efecto. (Los coreutils actuales de GNU leen el recuento exacto con head -c
, pero FreeBSD y NetBSD usan stdio.)
Más generalmente, dd
proporciona una interfaz a la API del archivo subyacente que es única entre las herramientas de Unix:solo dd
puede sobrescribir o truncar un archivo en cualquier momento o buscar en un archivo. (Este es dd
Es una habilidad única, y es grande; curiosamente dd
es mejor conocido por cosas que otras herramientas pueden hacer).
- La mayoría de las herramientas de Unix sobrescriben su archivo de salida, es decir, borran su contenido y lo vuelven a iniciar desde cero. Esto es lo que sucede cuando usas
>
redirección en el shell también. - Puede anexar el contenido de un archivo con
>>
redirección en el shell, o contee -a
. -
Si desea acortar un archivo eliminando todos los datos después de cierto punto , esto es compatible con el kernel subyacente y la API C a través de
truncate
función, pero no expuesta por ninguna herramienta de línea de comando exceptodd
:dd if=/dev/null of=/file/to/truncate seek=1 bs=123456 # truncate file to 123456 bytes
-
Si desea sobrescribir datos en medio de un archivo, de nuevo, esto es posible en la API subyacente abriendo el archivo para escribir sin truncar (y llamando a
lseek
para moverse a la posición deseada si es necesario), pero solodd
puede abrir un archivo sin truncar o agregar, o buscar desde el shell (ejemplo más complejo).# zero out the second kB block in the file (i.e. bytes 1024 to 2047) dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
Entonces... Como herramienta del sistema, dd
es bastante inútil. Como herramienta de procesamiento de texto (o archivo binario), ¡es bastante valiosa!