shell – 如何在不复制的情况下删除部分二进制文件

我需要删除6MB文件的前2个字节.但是,这是一个嵌入式Linux,只有32 MB RAM和不到1 MB的可用闪存.

我尝试使用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输入

4 – #(dd if = ouput_1; dd if = ouput_2)>输出中

5 – #rm -rf ouput_1 ouput_2

对于/ tmp下的所有文件(在RAM上安装为tmpfs),我的问题是在第3行和第5行之前,所需的内存是12 MB(2x6MB),并且该过程有时会失败并提供“内存不足”错误.

有没有办法我可以删除前2个字节而不分配文件大小的两倍?我可以使用dd(或任何其他)来“切换”二进制文件吗?

最佳答案
我认为这应该有效:

$  # Create test file
$echo "Hello, World" > h.data
$
$  # Move contents up by 2 bytes
$  # Note if= and of= are the same for in-place editing
$dd bs=2 if=h.data skip=1 seek=0 conv=notrunc of=h.data
5+1 records in
5+1 records out
11 bytes (11 B) copied, 0.000598796 s, 18.4 kB/s
$
$  # Note 11 bytes were moved above
$  # Truncate the file after byte 11
$dd bs=11 if=h.data skip=1 seek=1 count=0 of=h.data
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000338852 s, 0.0 kB/s
$
$  # Display edited file:
$cat h.data
llo, World
$

将这一切全部包含在脚本中你可以得到这样的东西:

#!/bin/bash

size=$(stat -c %s "$2")
dd bs=$1 if="$2" skip=1 seek=0 conv=notrunc of="$2"
dd bs=$((size - $1)) if="$2" skip=1 seek=1 count=0 of="$2"

将此称为:

./truncstart.sh 2 file.dat

其中2是从file.data开头删除的字节数

正如@Gilles指出的那样,这种解决方案在计划外中断的情况下并不稳健,这可能会在dd的处理过程中发生;在这种情况下,文件将被破坏.

转载注明原文:shell – 如何在不复制的情况下删除部分二进制文件 - 代码日志