Используйте `dd`, чтобы вырезать конец файла

18

Возможно, для этого есть простой трюк, но я не могу понять из справочной страницы.

Как вырезать последние 1 МБ из файла с неопределенным размером, например, с помощью dd?

zetah
источник
1
Вы хотите копию этого файла, за исключением последнего 1 МБ, или вы хотите, чтобы последний МБ был скопирован в другой файл?
Мат
Я хочу последний 1MB
Zetah

Ответы:

29

Ну, если у вас есть statи bash, вы можете получить размер файла с помощью:

stat -c %s your_file

Если вы хотите извлечь последние $amountбайты для этого файла dd, вы можете:

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

Но более разумный подход заключается в использовании tail:

tail -c $(( 1024*1024 )) your_file > target_file
Мат
источник
Нет -cварианта для head?
ADTC
Я думаю, что он имел в виду + ​​$ ((1024 * 1024)): -c, --bytes = K вывести последние K байтов; в качестве альтернативы используйте -c + K для вывода байтов, начиная с Kth каждого файла
Vanuan
5
дд - помощь
Использование: dd [OPERAND] ...
  или: ДД ОПЦИЯ
Скопируйте файл, конвертируя и форматируя в соответствии с операндами.

  bs = BYTES чтение и запись байтов BYT за раз (см. также ibs =, obs =)
  cbs = BYTES конвертировать байты за раз
  conv = CONVS преобразовать файл в соответствии с разделенным запятыми списком символов
  count = BLOCKS копировать только блоки ввода BLOCKS
  ibs = BYTES читает байты за раз (по умолчанию: 512)
  if = FILE читать из FILE вместо стандартного ввода
  iflag = FLAGS читается согласно списку символов через запятую
  obs = BYTES записывают байты за раз (по умолчанию: 512)
  из = FILE записывать в FILE вместо stdout
  oflag = FLAGS записывать в соответствии с разделенным запятыми списком символов
  seek = BLOCKS пропускать блоки BLOBKS obs-size в начале вывода
  skip = BLOCKS пропустить блоки BLOBKS ibs-size в начале ввода
  status = noxfer подавить статистику передачи

За блоками и байтами могут следовать следующие мультипликативные суффиксы:
c = 1, w = 2, b = 512, кБ = 1000, K = 1024, МБ = 1000 * 1000, M = 1024 * 1024, xM = M
GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 и т. Д. Для T, P, E, Z, Y.

Если размер файла составляет ровно 10 МБ, 1024 * 10 10240 КБ Это оставит последние 1024 КБ. Вы должны указать размер блока, с которым вы работаете, используя опции ibs и 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

Вы также можете пропустить первые 1 МБ файла, используя опцию пропуска, чтобы прочитать до конца файла, пропуская первые 1 МБ.

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

Используя опцию поиска, вы можете записать конкретное место в вашем выходном файле. Скажем, вы хотите оставить первые 1 МБ и перепишите последние 8 МБ.

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

Вам, вероятно, нужно получить некоторые данные о размере вашего файла, чтобы убедиться, что вы получаете правильный объем данных в и из.

ls -s --block-size 1K ./my/10MB/file
человек лс

       --block размер = РАЗМЕР
              использовать SIZE-байтовые блоки. Смотрите формат РАЗМЕРА ниже

       -s, --size
              распечатать выделенный размер каждого файла в блоках

       SIZE может быть (или может быть целым числом, за которым следует) один из следующих
       понижение: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024 и т. д. для G, T,
       P, E, Z, Y.
nelaaro
источник