我想知道如何列出一个 tar 文件的内容只下降到某种程度?
我知道 tar tvf mytar.tar会列出所有的文件,但有时我只想看到某种程度上的目录。
tar tvf mytar.tar
类似地,对于命令 ls,我如何控制将要显示的子目录的级别?默认情况下,它只显示直接子目录,而不会进一步显示。
ls
如果我们可以告诉 find命令查看 tar 文件内部,那就太好了,但是我怀疑这是不可能的。
find
我快速而丑陋(并非万无一失)的方法是限制目录分隔符的数量,例如:
$ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'
2告诉显示不超过2个斜杠(在我的示例中,一个斜杠已经由用户/组分隔符生成) ,因此,最多显示一个深度的文件。您可能想尝试用不同的数字代替2。
我同意 莱昂布洛伊的回答的观点——在 tarball 本身内部没有办法直接做到这一点。
关于你问题的第二部分,ls没有最大深度选项。您可以使用 ls -R递归 一切,但是这通常不是很有用。
ls -R
然而,您可以同时使用 find和 tree来做到这一点。例如,要在一级深度列出文件和目录,可以这样做
tree
find -maxdepth 2
或者
tree -L 2
tree还有一个 -d选项,它递归地列出目录,但不列出文件,我发现这通常比 -L有用得多。
-d
-L
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脚本,并且具有相同的效果。
awk
深度 = 1
tar --exclude="*/*" -tf file.tar
深度 = 2
tar --exclude="*/*/*" -tf file.tar
另一个选择是 Archivemont。你把它装上,然后把 CD 放进去。然后您可以像处理其他文件系统一样处理它。
$ archivemount /path/to/files.tgz /path/to/mnt/folder
它似乎比 tar 方法更快。
我只能使用 grep 在特定深度显示 目录名称:
深度 3:
3
tar -tf mytar.tar | grep -Ex '([^/]+/){3}'
或深度 $DEPTH:
$DEPTH
tar -tf mytar.tar | grep -Ex '([^/]+){$DEPTH}/'
您可以通过将 grep与来自@sacapeao 的 接受的答案的 --exclude相结合来加速这一过程。
grep
--exclude
深度3:
tar --exclude '*/*/*/*/*' -tf mytar.tar | grep -Ex '([^/]+/){3}'