Recientemente me di cuenta de que podemos usar cat
tanto como dd
, y en realidad es más rápido quedd
Sé que dd
fue útil para tratar con 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 se dd
puede hacer algo cat
que no se puede? (Aquí consideraría que una diferencia de rendimiento inferior al 20% es irrelevante).
¡Ejemplos concretos estarían bien!
Respuestas:
En apariencia,
dd
es una herramienta de un sistema operativo IBM que retiene su apariencia extraña (su paso de parámetros), que realiza algunas funciones muy raramente utilizadas (como conversiones EBCDIC a ASCII o inversión de endianness ... no es una necesidad común hoy en día).Yo solía pensar que
dd
era más rápido para copiar grandes bloques de datos en el mismo disco (debido a un uso más eficiente de almacenamiento temporal), pero esto no es cierto , al menos en los sistemas Linux de hoy en día.Creo que algunas de
dd
las opciones son útiles cuando se trata de cintas, donde la lectura realmente se realiza 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 que
dd
puede hacer es que ninguna otra herramienta POSIX puede hacer (fácilmente) tomar los primeros N bytes de una secuencia. Muchos sistemas pueden hacerlohead -c 42
, perohead -c
, aunque son comunes, no están en POSIX (y no están disponibles hoy, por ejemplo, en OpenBSD). (tail -c
es POSIX.) Además, incluso dondehead -c
exista, podría leer demasiados bytes de la fuente (porque utiliza internamente el almacenamiento en búfer stdio), lo cual es un problema si está leyendo desde un archivo especial donde solo la lectura tiene un efecto. (Los coreutils actuales de GNU leen el recuento exactohead -c
, pero FreeBSD y NetBSD usan stdio).En términos más generales,
dd
proporciona una interfaz para la API de archivo subyacente que es única entre las herramientas de Unix: solodd
puede sobrescribir o truncar un archivo en cualquier punto o buscar en un archivo. (Esta esdd
una habilidad única, y es grande; curiosamentedd
es mejor conocida por cosas que otras herramientas pueden hacer).>
redirección en el shell.>>
redirección en el shell, o contee -a
.Si desea acortar un archivo eliminando todos los datos después de un cierto punto , esto es compatible con el núcleo subyacente y la API de C a través de la
truncate
función, pero no está expuesto por ninguna herramienta de línea de comandos, exceptodd
:Si desea sobrescribir datos en el medio de un archivo, nuevamente, esto es posible en la API subyacente abriendo el archivo para escribir sin truncar (y llamando
lseek
para moverse a la posición deseada si es necesario), pero solodd
puede abrir un archivo sin truncar o anexar, o buscar desde el shell ( ejemplo más complejo ).Entonces ... Como herramienta del sistema,
dd
es bastante inútil. Como herramienta de procesamiento de texto (o archivo binario), ¡es bastante valioso!fuente
trunc
y deseek
ser utilizabledd
).dd
puede leer datos binarios de descriptores de archivo no buscables sin destruir potencialmente los datos no leídos debido al almacenamiento en búfer stdio. Vea aquí para ver un ejemplo: etalabs.net/sh_tricks.htmlhead -c N
llamadasread
y nunca va más allá de N. En NetBSD 5.1,head -c
llamadasgetc
. En FreeBSD 7.4,head -c
llamadasfread
.dd
también expone O_DIRECT (etc.) a las secuencias de comandos de shell, que creo que también es único.truncate
permite truncar o extender archivos, eliminando así otro uso dedd
.El
dd
comando incluye MUCHAS opciones que cat no puede acomodar. Quizás en sus casos de uso cat es un sustituto viable, pero no es un reemplazo de dd.Un ejemplo sería usar
dd
para copiar parte de algo pero no todo. Tal vez desee extraer algunos de los bits del medio de una imagen iso o de la tabla de partición desde un disco duro en función de una ubicación conocida en el dispositivo. Condd
usted puede especificar las opciones de inicio, detención y cantidad que permiten estas acciones.Estas opciones lo
dd
hacen indispensable para la manipulación de datos de grano fino, mientras quecat
* solo puede operar en objetos de archivos completos, dispositivos o transmisiones.* Como señaló Gilles en los comentarios, es posible combinarlo
cat
con otras herramientas para aislar partes de algo, perocat
aún funciona en todo el objeto.fuente
dd
en realidad no tiene nada que ver con dispositivos de bajo nivel, necesita una entrada/dev
como las demás. Puede copiar una partición completa concat
, o una parte de ella contail +c $(($start+1)) | head -c $count
.cat | head | tail
para obtener los últimos MB, el disco giratorio absorberá la luna más cerca de la tierra.Nadie ha mencionado aún que puede usar dd para crear archivos dispersos , aunque
truncate
también puede usarse para el mismo propósito.Esto es casi instantáneo y crea un archivo grande arbitrario que puede usarse como un archivo loopback, por ejemplo:
Lo bueno es que inicialmente solo usa un solo bloque de espacio en disco, y luego crece solo según sea necesario (el formato ext4 de un archivo de 10GB consume 291 MB en mi sistema). Úselo
du
para ver cuánto espacio en disco se usa realmente:ls
informa solo el tamaño máximo que puede alcanzar el archivo.fuente
ls -ls
le muestra el tamaño escaso.dd of=sparse-file bs=1 count=0 seek=10G
sería equivalente atruncate -s 10GB sparse-file
. Lo suficientemente confuso,truncate
ydd
tener una interpretación exactamente opuesta deGB
vs.G
...man dd
dice:MB =1000*1000, M =1024*1024
y así sucesivamente. Yman truncate
dice:,MB 1000*1000, M 1024*1024
entonces no hay diferencia. Yo uso ambosdd
ytruncate
de los coreutils de GNU. ¡Tú también deberías hacerlo! :-)Reemplazar segmentos específicos de un disco duro con algo es un ejemplo común. Por ejemplo, es posible que desee eliminar su MBR con este comando:
También puede crear archivos vacíos con él (por ejemplo, para imágenes de disco de bucle):
fuente
head -c
? ¡Por favor comparta un punto de referencia !dd
es muy útil para hacer una copia de seguridad del sector de arranque de un disco duro u otro dispositivo de almacenamiento (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
) y luego reescribirlo (dd if=boot_sector.bin of=/dev/sda
). Es igualmente útil para hacer una copia de seguridad de los encabezados de los volúmenes cifrados.cat
podría ser torcido para hacer eso, pero no confiaría en la reescritura. Es difícil obtenercat
solo lectura / escritura de un cierto número de bytes.fuente
Recientemente tuve motivos para clonar algunas particiones de varios cientos de GB por primera vez en mi historial de Linux (cf
cp -ar
orsync
que me han servido muchas veces). Por supuesto, recurrí add
'porque todos saben que eso es lo que usas ... y me quedé horrorizado por el rendimiento. Un poco de búsqueda en Google pronto me llevóddrescue
, lo que he usado varias veces y funciona de maravilla (mucho más rápido que dd).fuente
ddrescue
es genial, especialmente para extraer datos de discos defectuosos.Aquí hay algunos trucos de dd que he inventado a lo largo de los años.
Cortar y pegar en tty hostil o bash en modo no interactivo
Si se encuentra en una situación en la que no se detecta EOF / ^ D / ^ F, puede usar dd para transferir archivos de texto a un host. Ya que dejará de leer después de una cantidad especificada de bytes automáticamente.
Utilicé esto tan recientemente como el año pasado durante un ejercicio de seguridad en el que pudimos obtener shells no tty en un host remoto y necesité transferir archivos.
De hecho, incluso hice un par de archivos binarios codificándolos en base64 y usando un script de decodificación de base64 puro, lento pero confiable.
Un truco genial es que mientras dd se está ejecutando, si le envía una señal USR1, emitirá su estado actual (bytes leídos, bytes por segundo ...)
Filtro de estado de rendimiento universal
Escribí esto para actuar como un filtro de progreso de bash puro para cualquier programa que emita datos a través de stdout. (Nota: casi cualquier cosa emitirá datos a través de stdout: para los programas que no lo hacen, puedes hacer trampa si no te molestan usando / dev / stdout como nombre de archivo. Pero la idea es básicamente, cada vez que obtienes X cantidad de bytes, imprimir marcas hash (como FTP de la vieja escuela cuando tenía activado el modo hash)
(Nota) Lo del archivo de progreso es poco convincente, esto fue principalmente una prueba de concepto. Si lo rehizo, solo usaría una variable.
archivos de cortar y cortar dados utilizando manijas anónimas de shell
Aquí hay un ejemplo extremadamente pseudocódigo de cómo puede tener un archivo tar firmado que puede extraer sin errores al proporcionar entrada tar a través de un identificador de archivo anónimo, sin usar ningún archivo tmp para almacenar datos parciales del archivo.
El tl; dr es: encuentro dd increíblemente útil. Y estos son solo los tres ejemplos que se me ocurren en la cabeza.
fuente
Puede redirigir parte del contenido de salida. Es particularmente útil, si necesita escribir con
sudo
:Además
sudo
es equivalente a:o a esto:
fuente