4

Я хотел бы добавить 8 байтов данных в начало двоичного файла.

Есть ли команда Linux для этого?

4 ответа4

14

Вот один из способов сделать это.

printf "\x68\x65\x6c\x6c\x6f\x20\x77\x6f" | cat - oldfile > newfile

Аргументом для printf является последовательность из 8 байтов в шестнадцатеричном формате. Просто замените значения, которые я использовал (которые являются символами ASCII "привет"), на ваши.

3

это не команда, это «куча команд» (в старой доброй традиции Unix):

  • поместите ваши 8 байтов в файл
  • добавить исходный файл в этот файл
  • переименуйте новый файл в имя исходного файла.

или же:

% echo -n "12345689" > new_file
% cat original >> new_file
% mv new_file original

или, если вам нужно прочитать 8 байтов из другого места:

% dd if=inputstream of=new_file bs=1 count=8

а затем продолжайте, как указано выше.

1

Это не правильный ответ на исходный вопрос, а просто комментарий для решения весьма уместной проблемы в комментарии @mxmlnkn

Итак, мне нужно добавить 256 КБ к файлу размером 120 ГБ, и я не хочу ждать 30 минут, чтобы полностью скопировать и записать все 120 ГБ ... Разве нет пути?

Поищите в Интернете «Fallocate prepend to file», это должно показать вам несколько ответов на основе StackExchange (РЕДАКТИРОВАТЬ: например, https://stackoverflow.com/a/37884191/9378469).

Свернутый подход, учитывая Linux 4.1+ (XFS) или 4.2+ (XFS, ext4), позволяет вставлять в файлы дыры размером с файловую систему, надеемся, в постоянное время. Это может быть или не быть достаточно гибким для вашей проблемы.

0

проверено в cygwin, должно работать на linux.

использует xxd и sed

в одну строку

$ xxd -p a.a | sed 's/^/6162636465/' | xxd -r -p > a2.a

сломанный

display a.a
$ cat a.a
abc



look at the hex of a.a  
user@comp ~
$ xxd -p a.a
6162630a

Файл фактически содержит новую строку в конце, как показано выше в xxd.

посмотрите, сколько строк напечатает xxd -p .. будет только одна, независимо от того, какой файл ему дан, так как все символы в файле превращаются в шестнадцатеричный формат, и он печатает фактический \n в конце того, что он выгружал. (что бы вы увидели, если бы вы сделали xxd -p aa | xxd -p)

$ xxd -p a.a | wc -l
1

sed работает с каждой строкой, и при вводе xxd -p sed всегда будет вводить только одну строку, что очень просто.

user@comp ~
$ xxd -p a.a | sed 's/^/6162636465/'
61626364656162630a

user@comp ~
$ xxd -p a.a | sed 's/^/6162636465/' | xxd -r -p > a2.a

user@comp ~
$ xxd -p a2.a
61626364656162630a

user@comp ~
$ cat a2.a
abcdeabc

user@comp ~
$

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .