72

我想知道如何仅将 tar 文件的内容列出到某个级别?

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

同样,对于 command ls,如何控制将显示的子目录的级别?默认情况下,它只会显示直接子目录,而不会进一步显示。

4

6 回答 6

172

深度=1

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


深度=2

tar --exclude="*/*/*" -tf file.tar
于 2011-11-14T01:33:36.273 回答
37
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脚本,并具有相同的效果。

于 2010-04-23T18:24:46.397 回答
8

另一种选择是archivemount。你挂载它,然后 cd 进入它。然后你可以用它做任何事情,就像其他文件系统一样。

$ archivemount /path/to/files.tgz /path/to/mnt/folder

它似乎比 tar 方法更快。

于 2016-11-21T04:35:42.407 回答
6

如果我们可以告诉find命令查看 tar 文件,那就太好了,但我怀疑这是可能的。

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

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

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

于 2010-04-23T17:27:55.493 回答
5

I agree with leonbloy's answer - there's no way to do this straightforwardly within the tarball itself.

Regarding the second part of your question, ls does not have a max depth option. You can recurse everything with ls -R, but that's often not very useful.

However you can do this with both find and tree. For example to list files and directories one level deep, you can do

find -maxdepth 2

or

tree -L 2

tree also has a -d option, which recursively lists directories, but not files, which I find much more useful than -L, in general.

于 2010-04-23T17:54:39.423 回答
1

我能够使用 grep 仅显示特定深度的目录名称:

对于深度3

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

或深度$DEPTH

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

grep您可以通过结合--exclude@sacapeao接受的答案来加快速度。

对于深度 3:

tar --exclude '*/*/*/*/*' -tf mytar.tar | grep -Ex '([^/]+/){3}'
于 2021-11-09T18:58:47.927 回答