題 如何在Linux中將8字節數據添加到二進製文件中?


我想將8個字節的數據添加到二進製文件的開頭。

是否有Linux命令?


4
2018-01-14 06:58


起源




答案:


這是一種方法。

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

爭論的 printf 是十六進制的8字節序列。只需將您使用的值(即ASCII字符“hello wo”)替換為您的值。


14
2018-01-14 07:38



這應該是一個公認的答案。 - Dmitry Volosnykh
所以,我需要在一個120GB的文件前加256kB,我不想等待30分鐘完全複製並寫入整個120GB ......是不是沒辦法? - mxmlnkn
@mxmlnkn你需要操作系統和文件系統驅動程序支持這種合併。也許 btrfs 使用自定義內核? - jiggunjer
@mxmlnkn如果你的意思是256 KiB,這是512 B的倍數,那麼請看答案 這個問題。您可以將兩個或多個文件連接到一個特殊設備,而無需將結果寫入任何磁盤。 - Kamil Maciorowski


它不是'''命令,它是'一堆命令'(在舊的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

然後繼續如上。


3
2018-01-14 07:38





這不是對原始問題的正確答案,而只是一個評論,以解決@mxmlnkn評論中非常恰當的關注點

所以,我需要在一個120GB的文件前加256kB,我不想等待30分鐘完全複製並寫入整個120GB ......是不是沒辦法?

網絡搜索'fallocate prepend to file',這應該會顯示一些基於StackExchange的答案(EDIT:例如: https://stackoverflow.com/a/37884191/9378469)。

在Linux 4.1+(XFS)或4.2+(XFS,ext4)的情況下,fallocate方法允許您在文件中插入文件系統頁面大小的孔,希望在恆定時間內。 對於您的問題,這可能會或可能不夠靈活。


1
2018-02-18 22:45



歡迎來到超級用戶!對於一個7歲的問題來說,這顯然很棘手,但是“尋找 <短語>“這不是一個完整的答案 - 你可以擴展這個或者在這裡包含一個例子嗎?:) - bertieb
我的目標不是完整,只是為了增加一些信息,以防止讀者得出錯誤的結論。我甚至不想將此作為答案發布,但評論需要50個代表,這導致像這樣的次優情況。我編輯了“答案”,其中包含了目前我能找到的最全面答案的鏈接。 - Foo Barian


在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 -p prints..would只會是一個,不管它給出的文件是什麼,因為文件中的所有字符都變成了十六進制,並在它傾倒的末尾打印一個實際的\ n。 (如果你做了xxd -p a.a | 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 ~
$

0
2018-02-18 23:11