Быстро разделить двоичный файл по смещению

668
ericg

Файл, который мне нужно разделить, составляет 32 ГБ.

Мне нужно разделить файл на две части со смещением, которое я укажу, и мне нужно только сохранить вторую часть.

Я могу сделать это легко:

dd if=binary_file.bin of=second_part.bin bs=1 skip=143254 

Однако, это занимает очень много времени (часов), и мне нужен метод командной строки, который завершит процесс намного быстрее.

Какие-либо предложения?

Я использую OS X 10.11.6 (El Capitan).

0
Вам действительно нужно `bs = 1`? Это означает, что чтение байта за байтом будет очень медленным. Hennes 7 лет назад 1
Да, я знаю, что это действительно очень медленно. Если мне нужно использовать смещение 143253, что бы вы предложили? ericg 7 лет назад 0
Безотносительно ответа. Bs = 1 для всего файла всегда будет излишне медленным. Это все равно, что копировать букву из книги в букву. Как и при прочтении одного письма, напишите одно письмо. Обычно вы читаете одно предложение, а затем копируете его. Это то, что мы хотим сделать для большей части файла. Теперь нам просто нужно выяснить, как обойти странное смещение. Hennes 7 лет назад 0

1 ответ на вопрос

0
Hennes

Может быть, прочитать несколько байтов до границы 4 КБ, а затем вторую команду, чтобы добавить остальные?

Предполагая, что мы хотим закончить на границе 4K (большинство файловых систем, похоже, используют внутренние буферы 4K).

  1. Перейдите к той части, где вы хотите начать читать. (bs = 1 пропуск = 143254)
  2. читать с 143254 по 143254 с bs = 1 и счетом = 3990
  3. Прочитайте остальную часть файла с bs = 4k и добавьте его в выходной файл. (Смотрите, как добавить данные в файл с помощью dd здесь, на SU)

Если это слишком медленно и вы пишете это как повторяющуюся задачу, вы можете даже оптимизировать ее, выполнив 512b чтений для первых 3584 байтов (7 * 512), затем 400-разрядные однобайтовые чтения, а остальные - размером 4 КБ.

Обратите внимание, что этот ответ воспринимается как обходной путь. Я буду любить читать другие ответы, которые привлечет этот вопрос. Может быть, даже чистое решение, которое просто ищет 143254, а затем использует обычную опцию чтения / записи для копирования, что позволяет использовать настройки файловой системы по умолчанию, а не мои явные предположения о 4k внутренних буферах.