仅将tar文件或目录的内容列为某个级别

时间:2010-04-23 16:36:56

标签: bash tar ls depth

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

我理解tar tvf mytar.tar会列出所有文件,但有时我只希望看到某些级别的目录。

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

5 个答案:

答案 0 :(得分:122)

深度= 1

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


深度= 2

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

答案 1 :(得分:28)

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脚本,并具有相同的效果。

答案 2 :(得分:6)

如果我们能告诉find命令查看tar文件会很好,但我怀疑这是可能的。

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

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

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

答案 3 :(得分:5)

我同意leonbloy's answer - 在tarball本身内无法直接做到这一点。

关于问题的第二部分,ls没有最大深度选项。您可以使用ls -R递归所有,但这通常不是很有用。

但是,您可以同时使用findtree执行此操作。例如,要列出一级深度的文件和目录,您可以

find -maxdepth 2

tree -L 2

tree也有一个-d选项,它递归地列出目录,但不是文件,我发现这些文件通常比-L更有用。

答案 4 :(得分:4)

另一个选项是archivemount。你装载它,然后cd进去。然后就像使用其他文件系统一样,你可以用它做任何事情。

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

似乎比tar方法更快。