web-dev-qa-db-ja.com

コピーせずにバイナリファイルの一部を削除する方法

6MBファイルの最初の2バイトを削除する必要があります。ただし、これは32MバイトRAMで、空きフラッシュメモリが1MB未満の組み込みLinuxです。

私はddを次のように使用してみました:

1-#dd bs=1 skip=2 count=1022 if=input of=ouput_1

2-#dd bs=1024 skip=1 if=input of=ouput_2

3-#rm -rf input

4-#(dd if=ouput_1 ; dd if=ouput_2) > ouput

5-#rm -rf ouput_1 ouput_2

/ tmp(RAMにtmpfsとしてマウントされている)の下にあるすべてのファイルで、私の問題は、3行目と5行目の直前に必要なメモリが12 Mバイト(2x6MB)であり、プロセスが失敗して「メモリ不足」エラーが発生することです。 。

ファイルの2倍のサイズを割り当てずに最初の2バイトを削除する方法はありますか? dd(またはその他)を使用してバイナリファイルを「その場で」カットできますか?

4
srd

@DigitalTraumaの回答に基づいて、これがついに私のために働いたものです:

size=$(stat -c %s file)
dd bs=2 if=file skip=1 seek=0 conv=notrunc count=511 of=file
dd if=file ibs=1024 skip=1 of=file conv=notrunc obs=1022 seek=1
truncate file $(( size - 2 ))

最初の2バイトの削除は、処理を高速化するために2 ddステップで実行され、truncateはファイルの最後の数バイトを切り捨てるための小さなユーティリティです。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>


int main(int argc, char **argv) 
{
    if (argc != 3 ) {
        printf ("Usage: %s <file> <bytes>\n", argv[0]);
        exit(1);
    }

    if (truncate(argv[1], atoi(argv[2]))) {
        printf (" Error ! \n");
        exit(1);
    }

    return(0);
}
0
srd