¿Cómo hacer algo así dd if=somefile bs=1 skip=1337 count=31337000
, pero eficientemente, sin usar lecturas y escrituras que no sean de 1 byte?
La solución se espera:
- Para ser simple (para los no simples, puedo escribir una línea de Perl que haga esto)
- Para admitir grandes compensaciones y longitudes (por lo que los hacks con tamaño de bloque en dd no ayudarán)
Solución parcial (no lo suficientemente simple, intentar lo mismo con la longitud lo hará aún más complejo):
dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000
Respuestas:
Esto debería hacerlo (en gnu dd):
En caso de que estés usando
seek=
también, también puede consideraroflag=seek_bytes
.De
info dd
:PD: Entiendo que esta pregunta es antigua y parece que estas banderas se implementaron después de que la pregunta se hizo originalmente, pero como es uno de los primeros resultados de Google para una búsqueda de dd relacionada que hice, pensé que sería bueno actualizar con la nueva característica.
fuente
Use un proceso para deshacerse de todos los bytes iniciales, luego un segundo para leer los bytes reales, por ejemplo:
El segundo
dd
puede leer la entrada con cualquier tamaño de bloque que encuentre eficiente. Tenga en cuenta que esto requiere un proceso adicional para generar; dependiendo de su sistema operativo que tendrá un costo, pero probablemente sea más pequeño que tener que leer los archivos de uno en uno (a menos que tenga un archivo muy pequeño, en cuyo caso no habría ningún problema).fuente
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> "dd: número inválido '10000000001'"dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
read -n
para saltar? ¿Y luegohead -c
contar? Por ejemplo,cat somefile | (read -n 1337; head -c 31337000)
o podría hacerlo sin generar un proceso adicional:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
En lugar de
bs=1
usarbs=4096
o más.fuente
f.seek(1337)
antes de usarread(MY_CHUNK_SIZE)
Puedes probar el comando hexdump:
Si simplemente quieres ver el contenido:
fuente