从大文件的末尾删除空字节

iBu*_*Bug 3 dd files null

我刚刚使用以下命令从运行 Linux 发行版的 PC 上的 Raspberry Pi 备份了 microSD 卡:

dd if=/dev/sdx of=file.bin bs=16M
Run Code Online (Sandbox Code Playgroud)

microSD 卡只有 3/4 满,所以我想在这个巨大文件的末尾有一些空字节。我很确定我不需要那个。如何有效地从末尾删除这些空字节,以便以后可以使用此命令恢复它?

cat file.bin /dev/zero | dd of=/dev/sdx bs=16M
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 7

要在节省空间的同时创建磁盘的备份副本,请使用gzip:

gzip </dev/sda >/path/to/sda.gz
Run Code Online (Sandbox Code Playgroud)

当您想从备份中恢复磁盘时,请使用:

gunzip -c /path/to/sda.gz >/dev/sda
Run Code Online (Sandbox Code Playgroud)

这可能比仅仅剥离尾随的 NUL 字节节省更多的空间。

删除尾随 NUL 字节

如果你真的想删除尾随的 NUL 字节并且你有 GNU sed,你可以尝试:

sed '$ s/\x00*$//' /dev/sda >/path/to/sda.stripped
Run Code Online (Sandbox Code Playgroud)

如果大磁盘的数据超过 sed 的某个内部限制,这可能会遇到问题。虽然 GNU sed 对数据大小没有内置限制,但GNU sed 手册解释说系统内存限制可能会阻止处理大文件:

GNU sed 没有内置的行长限制;只要它可以 malloc() 更多(虚拟)内存,您就可以随心所欲地馈送或构造行。

但是,递归用于处理子模式和无限重复。这意味着可用的堆栈空间可能会限制某些模式可以处理的缓冲区的大小。