如何從檔案中刪除/刪除/剪切零/空位元組

如何從檔案中刪除/刪除/剪切零/空位元組

給定:一個通用的二進位檔案和一個區塊大小

所需的輸出:二進位檔案的副本,其中僅包含零位元/位元組的所有區塊已從檔案中刪除/剝離

我真的很想知道為什麼我找不到一個可以完成這項簡單工作的工具。我創建了一個小腳本,但它的效能很荒謬。一定有一個現有的軟體能夠做到這一點,不是嗎?

也許找到這個問題的問題是由於有太多術語可以用來表達這種需求...

編輯:您提到的 sed 線程替換每個位元組,如果連續至少有多個區塊大小,我只想替換 0 位元組。

我想調查一個非常大的稀疏文件(不像文件系統中的稀疏文件那樣稀疏),並且對於此分析,我想刪除不相關的部分

編輯 2:檔案大小約為 10 到 1000 GB。對於小尺寸,我自己的慢速工具還可以,但對於這麼大的文件...

答案1

bbe是「sed類似二進位檔案的編輯器」。在 Debian 中,它位於bbe軟體包中。

s/^\0*$//如果您能夠識別出充滿空位元組的區塊並將其刪除,那就最好了。我的測試表明這種類似正則表達式的表達式在bbe.您仍然可以(幾乎)\0根據需要使用盡可能多的數量:

s/\0\0…\0\0//

其中表示子串的正確數量\0。如果您選擇較大的區塊大小,那麼透過命令列傳遞相應長的字串可能會出現問題。幸運的是bbe支援從文件讀取腳本。像這樣進行:

# The following function uses non-POSIX 'for' loop. Rewrite if necessary.
gen_script() {
   printf 's/'
   for ((i=0;i<"$1";i++)); do
      printf '\\0'
   done
   printf '//\n'
}

# This needs to be a plain decimal number:
blocksize=512

gen_script "$blocksize" > bbe-script
<binary_file_in bbe -b ":$blocksize" -f bbe-script >binary_file_out

問題:

  1. 上面的實作gen_script非常慢,對於大型blocksize.
  2. 在我的測試中bbe,行為不當的時間blocksize超過16384(即 16 KiB 的區塊)。這使得第一個問題變得無關緊要。
  3. 這個角色bbe本身似乎也不是很快。我不知道你的「非常大的文件」有多大。如果我是你我會嘗試

    pv binary_file_in | bbe -b ":$blocksize" -f bbe-script >binary_file_out
    

    幾秒鐘後我就能知道預計到達時間是否可以接受。

相關內容