Возможно, для этого есть простой трюк, но я не могу понять из справочной страницы.
Как вырезать последние 1 МБ из файла с неопределенным размером, например, с помощью dd
?
Возможно, для этого есть простой трюк, но я не могу понять из справочной страницы.
Как вырезать последние 1 МБ из файла с неопределенным размером, например, с помощью dd
?
Ответы:
Ну, если у вас есть 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
?
дд - помощь Использование: 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.