- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一个资源有限的 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 ,这不会太困难。
我会做的是:
tar tf
是否正确显示测试文件tar tf
找到测试文件的名称,则成功如果上述过程成功,您可以继续将新文件附加到 tar 存储库。
不知道你有没有trunc命令。如果没有,您可以使用 dd
将文件复制到指定偏移量处的旧文件之上(请参阅 seek=
选项)。 dd
将在复制结束时自动截断文件。您还可以使用 dd
读取 512 字节的 block (请参阅 skip
和 count
选项)。
关于linux - BusyBox tar : append workaround given limited disk space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28992171/
Racket 的 pict , 有几个 combinators for combining other pictures .这些文档包含一个很好的表格,说明其 *-append 组合器的工作方式: 这
我看过 Insert content into iFrame和他们的 fiddle http://jsfiddle.net/8VP4y/3/提出以下我遇到问题的代码。 我已经为下面的问题创建了一个 j
我有一个显示非常奇怪结果的微基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations =
我想知道是否有人可以回答我使用 StringBuilder 对象在 java 中执行这些语句中的哪一个会更好: 使用 .append(string1 + string 2) 对比 .append(st
假设我有两个相同类型的流。是否可以将一个流 append 到另一个流而无需事先将它们转换为列表? 例子: Stream ms = ...; Stream ns = ...; return ms.app
我有以下有效的 jQuery 代码,但它让我思考是否可以对正在 append 的内容执行 append 操作,而无需指定我想要 append 的内容。 append().append() 并没有达到目
这是为了显示诊断页面的检查。我有一个 .append(not_ok) 但当 swf 文件加载 100% 时,我想删除 not_ok 附加,然后添加一个 .append(ok)。 function ca
x = [[1,2],[2,3],[10,1],[10,10]] def duplicatingRows(x, l): severity = x[l][1] if severity =
我有一个列表,我正在尝试将数据注入(inject)其中。列表如下所示 data2 = ['TECH2_HELP', 'TECH2_1507', 'TECH2_1189', 'TECH2_4081',
为了有效地进行一些 DOM 操作,我分离了一个元素。在这个过程中,我遇到了一个有趣的情况: var $holder = $("#d"); var $wrapper = $("").css("borde
我遇到了图片在移动设备上加载速度不够快的问题。我的元素有一个图像和一个按钮。单击该按钮时,图像向下滑动,另一幅图像从顶部滑动以取代它。这是代码 html CSS .moveF
我正在编写一个包含 10 个遗愿 list 的简单哈希表。使用内置的 hash() 计算索引,然后对表大小取模。但是,当我尝试将该对象 append 到该索引处的存储桶列表时,它会 append 到每
我是 LISP 的新手,我正在尝试处理类的 cond 语句。目前,我正在尝试检查传递的值是否为列表,如果是,则将字母 d append 到列表中。 这是我的代码: (defun test(L) (li
我正在使用 Jquery 将数据 append 到 div。但是,append 语句之后页面上没有显示任何内容。 我尝试使用 $(window).load 来确保页面已加载,但这仍然不起作用。 HTM
我有以下代码; function SetupDropdowns() { var PrevType; dropdown1 = document.getElemen
我想在 smarty 中创建一个数组并在其中执行 append 功能!就像我在 smarty 模板中声明一个变量(如 {assign var=sizearr value=''} )然后我想在循环中向其
请考虑以下代码片段: var ul = $(".list_b").find("li").remove().end(); $.each(Sites, functi
我的日志记录配置中有两个 appenders。其中之一在 ERROR 事件上发送电子邮件。 一个类,我无法控制,垃圾邮件 ERROR 消息。所以我仍然想要那些消息,但不是在两个 appenders 中
我正在尝试制作 editText,我要在其中插入一些文本。在每三个字符之后,我想插入破折号。 例子: 类型:123 结果:123- 现在当光标在破折号后面并且你按下删除键时,我想删除破折号和破折号
当我尝试 append 简单的“hello”时,它会被 append ,但很快就会自动删除。仅当我在下面给出的表单中使用它时,才会出现此问题,如果删除该表单,则不会出现问题,并且 hello 会正确
我是一名优秀的程序员,十分优秀!