Use 'dd' para cortar a parte final do arquivo

18

Provavelmente existe um truque simples para fazer isso, mas não consigo visualizar a página man.

Como faço para cortar 1MB passado do arquivo com tamanho indeterminado, por exemplo, usando dd ?

    
por zetah 28.02.2012 / 13:56

2 respostas

29

Bem, supondo que você tenha stat e bash , é possível obter o tamanho do arquivo com:

stat -c %s your_file

Se você quiser extrair os últimos $amount bytes para esse arquivo com dd , poderá:

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

Mas a abordagem mais prudente seria usar tail :

tail -c $(( 1024*1024 )) your_file > target_file
    
por 28.02.2012 / 14:28
5
dd --help
Usage: dd [OPERAND]...
  or:  dd OPTION
Copy a file, converting and formatting according to the operands.

  bs=BYTES        read and write BYTES bytes at a time (also see ibs=,obs=)
  cbs=BYTES       convert BYTES bytes at a time
  conv=CONVS      convert the file as per the comma separated symbol list
  count=BLOCKS    copy only BLOCKS input blocks
  ibs=BYTES       read BYTES bytes at a time (default: 512)
  if=FILE         read from FILE instead of stdin
  iflag=FLAGS     read as per the comma separated symbol list
  obs=BYTES       write BYTES bytes at a time (default: 512)
  of=FILE         write to FILE instead of stdout
  oflag=FLAGS     write as per the comma separated symbol list
  seek=BLOCKS     skip BLOCKS obs-sized blocks at start of output
  skip=BLOCKS     skip BLOCKS ibs-sized blocks at start of input
  status=noxfer   suppress transfer statistics

BLOCKS and BYTES may be followed by the following multiplicative suffixes:
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, and so on for T, P, E, Z, Y.

Se o tamanho do arquivo for exatamente 10MB, 1024 * 10 10240K Isso deixará os últimos 1024K. Você deve especificar o tamanho do bloco com o qual está trabalhando usando as opções ibs e 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

Você também pode pular os primeiros 1MB de um arquivo, usando a opção skip para ler até o final do arquivo pulando o primeiro 1MB.

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

Usando a opção de busca, você pode escrever um para um lugar específico no seu arquivo de saída. Digamos que você queira manter o primeiro 1MB e mais escrever os últimos 8MB.

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

Você provavelmente precisará obter alguns detalhes sobre o tamanho do seu arquivo para garantir que você obtenha a quantidade certa de dados.

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

       --block-size=SIZE
              use SIZE-byte blocks.  See SIZE format below

       -s, --size
              print the allocated size of each file, in blocks

       SIZE  may  be (or may be an integer optionally followed by) one of fol‐
       lowing: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T,
       P, E, Z, Y.
    
por 28.02.2012 / 14:54

Tags