Я хотел бы добавить 8 байтов данных в начало двоичного файла.
Есть ли команда Linux для этого?
Я хотел бы добавить 8 байтов данных в начало двоичного файла.
Есть ли команда Linux для этого?
Вот один из способов сделать это.
printf "\x68\x65\x6c\x6c\x6f\x20\x77\x6f" | cat - oldfile > newfile
Аргументом для printf
является последовательность из 8 байтов в шестнадцатеричном формате. Просто замените значения, которые я использовал (которые являются символами ASCII "привет"), на ваши.
это не команда, это «куча команд» (в старой доброй традиции Unix):
или же:
% echo -n "12345689" > new_file
% cat original >> new_file
% mv new_file original
или, если вам нужно прочитать 8 байтов из другого места:
% dd if=inputstream of=new_file bs=1 count=8
а затем продолжайте, как указано выше.
Это не правильный ответ на исходный вопрос, а просто комментарий для решения весьма уместной проблемы в комментарии @mxmlnkn
Итак, мне нужно добавить 256 КБ к файлу размером 120 ГБ, и я не хочу ждать 30 минут, чтобы полностью скопировать и записать все 120 ГБ ... Разве нет пути?
Поищите в Интернете «Fallocate prepend to file», это должно показать вам несколько ответов на основе StackExchange (РЕДАКТИРОВАТЬ: например, https://stackoverflow.com/a/37884191/9378469).
Свернутый подход, учитывая Linux 4.1+ (XFS) или 4.2+ (XFS, ext4), позволяет вставлять в файлы дыры размером с файловую систему, надеемся, в постоянное время. Это может быть или не быть достаточно гибким для вашей проблемы.
проверено в 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 ~
$