查看tar归档文件中的文件而不解压缩文件


16

我想查看焦油文件的内容而不提取它,方案:场景:我有一个.tar,里面有一个名为的文件./x/y.txt。我想查看的内容,y.txt而无需实际提取a.tar


如果使用Emacs,则只需在其中打开压缩包。
Qudit

嗯,要查看它,您必须将其提取。我猜您的意思是“不将其写入文件”?
Toby Speight 2015年

Answers:


20

这可能是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
GabLeRoux '16

只是需要这个答案:$ tar -axf file.tgz foo/bar -O
user1742529


4

这很简单

less  a.tar:./x/y.txt

如果已lesspipe安装并且env变量LESSOPEN定义为正确安装了lesspipe| /usr/bin/lesspipe.sh %s,则该魔术将起作用。


这是一个很棒的脚本-但不止一个。据我了解,lesspipe.sh应该是首选。
mikeserv

可以在压缩的tarball上使用吗?
terdon

这应该。但是我只是发现它在ubuntu中不起作用。去搞清楚。他们已破坏或删除了该功能。您仍然可以查看内容较少但不包含文件内容的存档列表:-(
solsTiCe 2015年

2

哦,但这是关于文件中tar文件内容的问题。实际上,在某些情况下这并不难。事实是,tar文件只是一个被阻止的流文件-存档中的每个文件都在文件之前被找到,每个文件都基于指定的格式获取元数据

基于这种格式,我曾经写过shitar-这是几行ddshell脚本,它们可以动态运行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并剥离即可-无需像实际操作那样对出现次数进行计数。tartar

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个字节的单位:

  • Ustar
    • tar交换格式; 请参阅“ 扩展描述”部分。对于字符特殊存档文件,此格式的默认块大小应为10240。实现应支持所有小于或等于32256的块大小值,该值是512的倍数。

因此,如果您使用的tar文件可能包含可能包含任意二进制数据的文件,则必须根据文件类型从算法上跳过该文件。规格说明:

  • size字段是文件的大小(以八位字节为单位)。
    • 如果该typeflag字段设置为指定文件的类型为1 链接2 符号链接,则该size字段应指定为零。
    • 如果该typeflag字段设置为指定类型5 目录的文件,则该size字段应按照该记录类型的定义中的描述进行解释。
    • 没有数据的逻辑记录被存储用于类型12,或5
    • 如果将该typeflag字段设置为3 字符特殊文件)4 块特殊文件)6 FIFO,则该size字段的含义在POSIX.1-2008的此卷中未指定,并且不应有任何数据逻辑记录。存储在介质上。
    • 另外,对于类型6size读取时将忽略该字段。
  • 如果该typeflag字段设置为任何其他值,则写在头之后的逻辑记录数应为,而忽略除法结果中的任何分数。( (size+ 511 ) / 512 )

...,当然,还要考虑每个标头的大小-这是每个成员的附加块。所以,你可能通过读通过读从头部,直到你的土地上有一条匹配你所寻求的头,此时你会那么需要检查当前记录是否只是描述了一个跳到标题链接到您的文件或到实际文件。这特别相关,因为当同一文件多次添加到存档中时,许多tars仅包含链接头,因为实际文件的数据已经可以在存档中的其他位置找到。

确认您需要将计算应用于chksum字段并确认您认为拥有的文件毕竟是您实际上想要的文件。tarchksum相当简单-

  • cks
    • chksum字段应为标头逻辑记录中所有八位位组的简单总和的八进制值的ISO / IEC 646:1991标准IRV表示。标头中的每个八位位组都应视为无符号值。这些值应加到一个无符号整数,该整数初始化为零,其精度不少于17位。在计算校验和时,将该chksum字段视为全部为<space>字符。

当然,您实际上并不需要执行任何操作,因为tar已经可以做到这一点-这就是它的工作-因此您可能应该只使用它来搜索档案并为您提取文件。这样一来,它不会做任何与您知道自己要做什么的事情截然不同的事情,只是它可能会做得更好,更快,因为这就是它的工作。而且无论如何,你为什么呢?


0

您可以使用此行

tar -axf a.tar -O

3
这不仅会显示tar中存在的任何文件,y.txt而且从OP的问题中也不清楚这是tar中唯一的文件。
Anthon 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.