我想查看焦油文件的内容而不提取它,方案:场景:我有一个.tar,里面有一个名为的文件./x/y.txt
。我想查看的内容,y.txt
而无需实际提取a.tar
。
我想查看焦油文件的内容而不提取它,方案:场景:我有一个.tar,里面有一个名为的文件./x/y.txt
。我想查看的内容,y.txt
而无需实际提取a.tar
。
Answers:
这可能是GNU特定的选项,但是您可以使用-O
或--to-stdout
将文件提取到标准输出
$ tar -axf file.tgz foo/bar -O
tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --O
例如,当许多文件匹配时*read_this_file*
。一切都打印在同一行上。从中man
,我发现了--to-command
。所以传递--to-command="echo '' && cat"
是有点黑魔法,但它起作用:D
$ tar -axf file.tgz foo/bar -O
这很简单
less a.tar:./x/y.txt
如果已lesspipe
安装并且env变量LESSOPEN
定义为正确安装了lesspipe| /usr/bin/lesspipe.sh %s
,则该魔术将起作用。
lesspipe.sh
应该是首选。
哦,但这是关于文件中tar
文件内容的问题。实际上,在某些情况下这并不难。事实是,tar
文件只是一个被阻止的流文件-存档中的每个文件都在文件之前被找到,每个文件都基于指定的格式获取元数据头。
基于这种格式,我曾经写过shitar
-这是几行dd
shell脚本,它们可以动态运行tar
大量块设备。基于同样的观点,最近我写了以下几行代码:
tar --no-recursion -c ./ |
{ printf \\0; tr -s \\0; } |
cut -d '' -f-2,13 |
tr '\0\n' '\n\t'
...用于tar
即时提取文件并对其组件文本文件执行内联转换。此处的cut
字段指向输入的NUL分隔 行的字段1,2,13。当文件仅包含文本文件时,这样的事情很容易,因为的记录分隔符(可能每512个字节发生一次)仅可以压缩为单个NUL并剥离即可-无需像实际操作那样对出现次数进行计数。tar
tar
tar
的标头格式如下:
field offset len
name 0 100
mode 100 8
uid 108 8
gid 116 8
size 124 12
mtime 136 12
chksum 148 8
typeflag 156 1
linkname 157 100
magic 257 6
version 263 2
uname 265 32
gname 297 32
devmajor 329 8
devminor 337 8
prefix 345 155
理解在处理简单tar
操作的相对容易程度与归档格式的极为复杂的方面之间存在一个陡峭的坡度。虽然简单的事情-例如将一小群同类型的文件打包在一起,甚至将仅包含您可以预测类型的成员拆分成档案-都可以通过一些shell管道轻松完成,但是可靠地处理任意档案成员并不是一件容易的事。
当这些成员可能包含任意二进制数据时,这特别困难-这肯定会妨碍对它的任何可靠应用tr -s
-仅当使用常规和/或非本地字符集以外的各种类型的文件和/或使用原始存档是由具有格式应用程序特性的实现创建的,而您不准备处理。这仅涉及tar
存档类型的基本,标准化方面-添加扩展的标头和格式扩展以及稀疏的文件和压缩,...再好不过了。
回到基础,虽然,标准记录的-size tar
归档是20块-或10240个字节。但是,如果给定一个归档文件被阻止在标准记录大小上,并且仅包含标准文件类型和标准ustar
标头,则应根据size
标头字段进行读取,直到找到与该标头大小匹配的成员,从成员标头跳到成员标头您寻求的。size
到达那里后,从目标成员标头尾部开始的偏移量中读取字节。那就是你的文件。
但是,跳过标头并不是一件容易的事。不同类型的附加或不附加与对应的实际数据块size
。例如,目录和链接将不包含此类数据块,而仅包含标题描述,因此在确切确定是否应将其size
字段应用于跳过公式之前,必须准备验证当前标题的文件类型。
另外,记录大小因素-取决于存档成员的大小是否与10240标准记录大小同步-大小可能会附加一个0块,也可能不附加。而记录 -size可以在归档文件的创建时间被宣布-因此它甚至可能不是在所有的20块,不过,通过规范,它必须被挡在512个字节的单位:
tar
交换格式; 请参阅“ 扩展描述”部分。对于字符特殊存档文件,此格式的默认块大小应为10240。实现应支持所有小于或等于32256的块大小值,该值是512的倍数。因此,如果您使用的tar
文件可能包含可能包含任意二进制数据的文件,则必须根据文件类型从算法上跳过该文件。规格说明:
size
字段是文件的大小(以八位字节为单位)。
typeflag
字段设置为指定文件的类型为1 (链接)或2 (符号链接),则该size
字段应指定为零。typeflag
字段设置为指定类型5 (目录)的文件,则该size
字段应按照该记录类型的定义中的描述进行解释。typeflag
字段设置为3 (字符特殊文件),4 (块特殊文件)或6 (FIFO),则该size
字段的含义在POSIX.1-2008的此卷中未指定,并且不应有任何数据逻辑记录。存储在介质上。size
读取时将忽略该字段。typeflag
字段设置为任何其他值,则写在头之后的逻辑记录数应为,而忽略除法结果中的任何分数。( (
size
+ 511 ) / 512 )
...,当然,还要考虑每个标头的大小-这是每个成员的附加块。所以,你可能通过读通过读从头部,直到你的土地上有一条匹配你所寻求的头,此时你会那么需要检查当前记录是否只是描述了一个跳到标题链接到您的文件或到实际文件。这特别相关,因为当同一文件多次添加到存档中时,许多tar
s仅包含链接头,因为实际文件的数据已经可以在存档中的其他位置找到。
确认您需要将计算应用于chksum
字段并确认您认为拥有的文件毕竟是您实际上想要的文件。tar
的chksum
相当简单-
chksum
字段应为标头逻辑记录中所有八位位组的简单总和的八进制值的ISO / IEC 646:1991标准IRV表示。标头中的每个八位位组都应视为无符号值。这些值应加到一个无符号整数,该整数初始化为零,其精度不少于17位。在计算校验和时,将该chksum
字段视为全部为<space>字符。当然,您实际上并不需要执行任何操作,因为tar
已经可以做到这一点-这就是它的工作-因此您可能应该只使用它来搜索档案并为您提取文件。这样一来,它不会做任何与您知道自己要做什么的事情截然不同的事情,只是它可能会做得更好,更快,因为这就是它的工作。而且无论如何,你为什么呢?