Use `dd` para cortar la parte final del archivo

18

Probablemente haya un truco simple para hacer esto, pero no puedo entenderlo desde la página de manual.

¿Cómo corto el último 1 MB del archivo con un tamaño indeterminado, por ejemplo, mediante el uso dd?

zetah
fuente
1
¿Desea una copia de ese archivo, excepto los últimos 1 MB, o desea que los últimos MB se copien en otro archivo?
Mat
Quiero el último 1 MB
zetah

Respuestas:

29

Bueno, suponiendo que tenga staty bash, puede obtener el tamaño del archivo con:

stat -c %s your_file

Si desea extraer los últimos $amountbytes para ese archivo dd, puede:

dd if=your_file of=extracted_part \
   bs=1 count=$amount \
   skip=$(( $(stat -c %s your_file) - $amount ))

Pero el enfoque más sensato sería usar tail:

tail -c $(( 1024*1024 )) your_file > target_file
Estera
fuente
No hay -copción para head?
ADTC
Creo que se refería a + $ ((1024 * 1024)): -c, --bytes = K genera los últimos K bytes; alternativamente, use -c + K para generar bytes comenzando con el Kth de cada archivo
Vanuan
5
dd --help
Uso: dd [OPERAND] ...
  o: dd OPCIÓN
Copie un archivo, convirtiéndolo y formateándolo de acuerdo con los operandos.

  bs = BYTES lee y escribe BYTES bytes a la vez (vea también ibs =, obs =)
  cbs = BYTES convierte bytes BYTES a la vez
  conv = CONVS convierte el archivo según la lista de símbolos separados por comas
  count = BLOCKS copia solo BLOCKS bloques de entrada
  ibs = BYTES lee bytes BYTES a la vez (predeterminado: 512)
  if = FILE lee de FILE en lugar de stdin
  iflag = BANDERAS leídas según la lista de símbolos separados por comas
  obs = BYTES escribe bytes BYTES a la vez (por defecto: 512)
  of = FILE escribe en FILE en lugar de stdout
  oflag = FLAGS escribe según la lista de símbolos separados por comas
  seek = BLOCKS omite BLOCKS bloques de tamaño obs en el inicio de la salida
  skip = BLOCKS skip BLOCKS bloques de tamaño ibs al inicio de la entrada
  status = noxfer suprimir estadísticas de transferencia

Los BLOQUES y BYTES pueden ir seguidos de los siguientes sufijos multiplicativos:
c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M
GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, y así sucesivamente para T, P, E, Z, Y.

Si el tamaño del archivo es exactamente 10MB, 1024 * 10 10240K Esto dejará los últimos 1024K. Debe especificar el tamaño de bloque con el que está trabajando utilizando las opciones ibs y obs.

1M = 1024K 
1024*9 = 9216  
dd if=/10/MB/file of=/9/MB/file count=9216K ibs=1K obs=1K
dd if=/10/MB/file of=/9/MB/file count=9M ibs=1M obs=1M

También puede omitir el primer 1 MB de un archivo, utilizando la opción de omitir para leer hasta el final del archivo omitiendo el primer 1 MB.

dd if=/10/MB/file of=/9/MB/file skip=1M ibs=1M obs=1M

Usando la opción de búsqueda, puede escribir un a un lugar específico en su archivo de salida. Supongamos que desea conservar el primer 1 MB y sobreescribir los últimos 8 MB.

dd if=/10/MB/file of=/9/MB/file skip=1M seek=1M count=8M ibs=1M obs=1M

Probablemente necesite obtener algunos detalles sobre el tamaño de su archivo para asegurarse de obtener la cantidad correcta de datos dentro y fuera.

ls -s --block-size 1K ./my/10MB/file
hombre ls

       --block-size = TAMAÑO
              use bloques de tamaño de bytes. Vea el formato de TAMAÑO a continuación

       -s, --size
              imprime el tamaño asignado de cada archivo, en bloques

       TAMAÑO puede ser (o puede ser un número entero opcionalmente seguido por) uno de los siguientes
       baja: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024, y así sucesivamente para G, T,
       P, E, Z, Y.
nelaaro
fuente