gpt4 book ai didi

linux - BusyBox tar : append workaround given limited disk space?

转载 作者:太空狗 更新时间:2023-10-29 12:14:56 26 4
gpt4 key购买 nike

我在一个资源有限的 Linux 系统和 BusyBox 上——这个版本的 tar 不支持 --append, -r。有没有一种解决方法可以让我 [1] 在 [2] 使 B 文件看起来来自目录 A 之后,将目录 B 中的文件附加到目录 A 中现有文件的 tar 中? (稍后,当有人提取文件时,它们应该都在同一个目录 A 中。)

情况:我有一个要压缩的文件列表,但我必须先处理其中一些文件。这些文件可能会被其他进程使用,所以我不想就地编辑它们。我想在使用磁盘空间时保持保守,所以我的脚本只复制需要更改的那些文件(与复制所有文件然后处理一些文件并最终使用 tar 将它们全部归档——如果我全部复制它们我可能会遇到磁盘空间问题)。

这意味着我要存档的文件最终位于两个不同的位置。但我希望生成的 tar 文件看起来好像它们都在同一位置。在我的脚本接近尾声时,我得到了两个按名称列出 A 和 B 文件的文本文件。

我认为这对于完整版本的 tar 来说很简单,但我必须使用 BusyBox 版本(下面的用法)。提前感谢您的任何想法!

Usage: tar -[cxtzjaZmvO] [-X FILE] [-f TARFILE] [-C DIR] [FILE]...

Create, extract, or list files from a tar file

Operation:
c Create
x Extract
t List
Options:
f Name of TARFILE ('-' for stdin/out)
C Change to DIR before operation
v Verbose
z (De)compress using gzip
j (De)compress using bzip2
a (De)compress using lzma
Z (De)compress using compress
O Extract to stdout
h Follow symlinks
m Don't restore mtime
exclude File to exclude
X File with names to exclude
T File with names to include

最佳答案

原则上,您只需将包含附加文件的tar 存储库附加到tar 文件的末尾。它只比这稍微难一点。

一个 tar 文件由任意数量的 header + file 重复组成。 header 始终是一个 512 字节的 block ,文件被填充为 512 字节的倍数,因此您可以将这些单元视为可变数量的 512 字节 block 。每个 block 都是独立的;它的标题以文件的完整路径名开头。因此,不需要将目录中的文件放在一起。

有一个并发症。在 tar 文件的末尾,至少有两个 512 字节的 block 完全用 0 填充。当 tar 正在读取 tar 文件时,它会忽略单个零填充的 header ,但第二个会导致它停止读取文件。如果遇到 EOF,它会报错,因此需要终止空 header 。

可能有两个以上的 header ,因为 tar 实际上写入的 block 是 512 字节的倍数。例如,Gnu tar 默认写入 20 512 字节 block 的倍数,因此最小的 tar 文件通常为 10240 字节。

为了追加新数据,您需要先截断现有文件以消除空 block 。

我相信如果 tar 文件是由 busybox 生成的,那么只会有两个空 block ,但我没有检查代码。那很容易;在附加其他文件之前,您只需截断文件的最后 1024 个字节。

对于一般的 tar 文件,它比较棘手。如果你知道文件本身没有 NUL 字节(即它们都是简单的文本文件),你可以删除空头,直到你找到一个包含非 0 字节的 block ,这不会太困难。

我会做的是:

  1. 截断 tar 文件的最后 1024 个字节。
  2. 记住 tar 文件的当前大小。
  3. 附加一个测试 tar 文件,该文件由带有简单短消息的文件的 tar 组成
  4. 验证 tar tf 是否正确显示测试文件
  5. 将文件截断回内存的长度,
    • 如果 tar tf 找到测试文件的名称,则成功
    • 如果tar文件的最后512字节全为0,截断文件的最后512字节,并返回步骤2。
    • 否则失败

如果上述过程成功,您可以继续将新文件附加到 tar 存储库。

不知道你有没有trunc命令。如果没有,您可以使用 dd 将文件复制到指定偏​​移量处的旧文件之上(请参阅 seek= 选项)。 dd 将在复制结束时自动截断文件。您还可以使用 dd 读取 512 字节的 block (请参阅 skipcount 选项)。

关于linux - BusyBox tar : append workaround given limited disk space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28992171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com