Как получить только первые десять байт двоичного файла

80

Я пишу сценарий bash, который должен получить заголовок (первые 10 байтов) файла, а затем в другом разделе получить все, кроме первых 10 байтов. Это двоичные файлы, и в первых 10 байтах они, скорее всего, будут содержать \0символы "и \n". Похоже, что большинство утилит работают с файлами ASCII. Как лучше всего решить эту задачу?

Пользователь1
источник
1
Для тех, кому нужен шестнадцатеричный вывод, см. Этот ответ unix.stackexchange.com/a/10882/103618
Алвин Кеслер

Ответы:

144

Чтобы получить первые 10 байтов, как уже отмечалось:

head -c 10

Чтобы получить все, кроме первых 10 байтов (по крайней мере, с GNU tail):

tail -c+11
psmears
источник
3
Да. ddИдея мне понравилась, но эта опция не требует изменения размера буфера, поэтому она хорошо работает с огромными файлами. Благодарю.
User1
42

head -c 10 делает здесь правильные вещи.

Лунная тень
источник
9
Интересно, что этот ответ был первым, он правильный, но у остальных гораздо больше голосов.
Роберт
34

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

dd if=infile of=outfile1 bs=10 count=1
dd if=infile of=outfile2 bs=10 skip=1
Марк Рэнсом
источник
1
Это работает, но довольно медленно. Значение BS 10 убивает эти огромные файлы. Есть ли более быстрый способ пропустить первые десять байтов? Это кажется таким простым.
User1
dd не надежен. Он может читать меньше байтов, чем запрошено, по разным причинам.
ceving
@ceving не могли бы вы упомянуть хотя бы одну из этих причин? Я не уверен, что верю тебе.
Марк Рэнсом,
В следующем примере печатается 1 вместо 2:{ printf a; sleep 1; printf b; } | dd bs=2 count=1 2>/dev/null | wc -c
ceving
Объяснение здесь и здесь
ceving