列出tar文件或目录的内容,只显示到某个级别

82

我想知道如何列出tar文件的内容,但仅限于某个级别?

我知道tar tvf mytar.tar将列出所有文件,但有时我只想看到某个级别的目录。

同样地,对于命令ls,我该如何控制要显示的子目录级别?默认情况下,它只会显示直接子目录,而不会进一步展开。


查看tree命令以列出多层次的子目录。 - Cameron
2
似乎 tar -tvf mytar.tar | less 比大多数答案都要简单。 - Superbest
@Cameron,tree 支持 .tar 文件吗? - brennebeck
@brennebeck:我怀疑这一点;我指的是关于“ls”的部分。抱歉造成困惑,我的评论不是很清楚。 - Cameron
6个回答

188

深度=1

tar --exclude="*/*" -tf file.tar


深度=2

tar --exclude="*/*/*" -tf file.tar

6
这只能获取文件名,无法获取文件夹名称。 - VicX
2
这个答案很棒。 - th3pirat3
我使用了深度=1的解决方案,并在将当前目录指定为目标的存档中得到了两个不同的结果。在其中一个存档中,我根本没有输出。另一个给出了输出"./"。我不知道它们为什么会不同。 - crantok
2
我认为这只适用于GNU tar。在BSD tar(包含在macOS中)上,它仅列出顶级文件而不是目录。我认为这与*被解释为0个或多个字符有关,并最终排除任何带有/的条目。要包括文件和目录,我能够使用模式“*/?*”,对于深度=2,“*/?*/?*”将起作用。 - Ryan C

40
tar tvf scripts.tar | awk -F/ '{if (NF<4) print }'


drwx------ glens/glens       0 2010-03-17 10:44 scripts/
-rwxr--r-- glens/www-data 1051 2009-07-27 10:42 scripts/my2cnf.pl
-rwxr--r-- glens/www-data  359 2009-08-14 00:01 scripts/pastebin.sh
-rwxr--r-- glens/www-data  566 2009-07-27 10:42 scripts/critic.pl
-rwxr-xr-x glens/glens     981 2009-12-16 09:39 scripts/wiki_sys.pl
-rwxr-xr-x glens/glens    3072 2009-07-28 10:25 scripts/blacklist_update.pl
-rwxr--r-- glens/www-data 18418 2009-07-27 10:42 scripts/sysinfo.pl

请注意,由于用户名/组中的斜杠符号,数字应为3 +您想要的级别数。如果只执行以下操作:

tar tf scripts.tar | awk -F/ '{if (NF<3) print }'

scripts/
scripts/my2cnf.pl
scripts/pastebin.sh
scripts/critic.pl
scripts/wiki_sys.pl
scripts/blacklist_update.pl
scripts/sysinfo.pl

只有两个。

你可以将ls -R的输出导入到这个awk脚本中,从而达到相同的效果。


3
这是一个出色的回答。不过我认为你可以将其简化一些,因为“print”是awk的默认操作:tar tvf scripts.tar | awk -F/ 'NF<4'。简化翻译:这个回答很好,但我认为你可以简化一下,因为"print"是awk的默认操作:tar tvf scripts.tar | awk -F/ 'NF<4' - user98761

10
另一种选择是使用archivemount。你可以挂载它,然后进入它。接下来,你就可以像处理其他文件系统一样对其进行任何操作。
$ archivemount /path/to/files.tgz /path/to/mnt/folder

看起来比tar方法更快。


6

希望我们能够告诉find命令在tar文件中查找,但我怀疑这是不可能的。

一种快速而丑陋(并非万无一失)的方法是限制目录分隔符的数量,例如:

 $ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'

2 表示不显示超过2个斜杠(在我的情况下,一个已经由用户/组分隔符生成),因此最多只显示深度为1的文件。您可以尝试将2替换为不同的数字。


5

我同意leonbloy的回答——在tarball本身内部没有直接实现这个功能的方法。

关于你问题的第二部分,ls没有最大深度选项。你可以用ls -R递归地列出所有内容,但这通常没什么用。

不过你可以使用findtree来实现这个功能。例如,要列出一级深度的文件和目录,可以这样做:

find -maxdepth 2

或者

tree -L 2

tree 还有一个 -d 选项,它递归地列出目录而不是文件,我发现这比一般情况下的 -L 更加实用。


True。如果您想要与“tar tvf”类似的输出,请在“find”命令中添加“-ls”选项。 - leonbloy

1
我能够使用grep仅显示特定深度的目录名称:
对于深度3
tar -tf mytar.tar | grep -Ex '([^/]+/){3}'

或者深度为$DEPTH

tar -tf mytar.tar | grep -Ex '([^/]+){$DEPTH}/'

你可以通过将 grep 与 @sacapeao 的 已接受的答案 中的 --exclude 结合使用来加快速度。

对于深度为3:

tar --exclude '*/*/*/*/*' -tf mytar.tar | grep -Ex '([^/]+/){3}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接