仅限tar列表文件


16

有趣的事实:如果您使用存档管理器并解压缩一个.tar.gz,以使您没有“保留目录结构”,您将得到一个tarbomb

tar -ztf列出tar文件中的所有文件和目录。没有目录结构,有没有办法列出tar文件中的所有文件?


您可以使用来获得“炸弹”效果tar xvzf my_tar.tar.gz --transform 's/.*\///'。但是很遗憾,这不会改变它在t而不是中的显示方式x
ire_and_curses 2013年

4
令我困扰的是,即使结构合理的档案也可以很容易地被用来制造大规模提取的武器。
Eero Aaltonen

Answers:


17

我在手册页上没有找到执行此操作的方法,但是您始终可以过滤结果。以下假设文件名中没有换行符:

tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'

怎么运行的

通过将字段分隔符设置为/,最后一个awk知道($NF)的字段是正在处理文件名的文件名,或者在正在处理目录名的情况下为空(在目录名tar后添加斜杠)。因此,我们基本上是在告诉awk最后一个字段是否不为空。


与awk相当不错的工作:)
Eero Aaltonen

5

利用约瑟夫R.的建议可以使用正则表达式[^/]$grep通过寻找线路没有结尾的文件/

tar tzf archive.tar.gz | grep -e "[^/]$"


仍然输出foo/bar而不是正义bar。您想要grep -Eo '[^/]+$'(使用GNU grep)。
斯特凡Chazelas

4

假设所有文件名都不包含换行符:

tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'

第一个sed命令删除/一行中最后一个命令之前的所有内容,以便仅打印文件名部分。第二条命令删除现在为空的行,即以a结尾的行,即/目录。


sed:-e表达式#2,字符2:未知命令:`/',并且sed语法感觉不太好。.直观
Eero Aaltonen

@EeroAaltonen我修复了sed命令。实际上,语法有些含糊(我的回答中确实包含解释)。
吉尔(Gilles)'所以

2

pax(POSIX命令读取tar文件):

pax -'s@.*/@@' < file.tar

(列出所有文件,无论其类型如何,包括目录)。

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.