我想知道如何列出tar文件的内容,但仅限于某个级别?
我知道tar tvf mytar.tar
将列出所有文件,但有时我只想看到某个级别的目录。
同样地,对于命令ls
,我该如何控制要显示的子目录级别?默认情况下,它只会显示直接子目录,而不会进一步展开。
深度=1
tar --exclude="*/*" -tf file.tar
深度=2
tar --exclude="*/*/*" -tf file.tar
*
被解释为0个或多个字符有关,并最终排除任何带有/
的条目。要包括文件和目录,我能够使用模式“*/?*
”,对于深度=2,“*/?*/?*
”将起作用。 - Ryan Ctar 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
脚本中,从而达到相同的效果。
tar tvf scripts.tar | awk -F/ 'NF<4'
。简化翻译:这个回答很好,但我认为你可以简化一下,因为"print"是awk的默认操作:tar tvf scripts.tar | awk -F/ 'NF<4'
- user98761$ archivemount /path/to/files.tgz /path/to/mnt/folder
看起来比tar方法更快。
希望我们能够告诉find
命令在tar文件中查找,但我怀疑这是不可能的。
一种快速而丑陋(并非万无一失)的方法是限制目录分隔符的数量,例如:
$ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'
2 表示不显示超过2个斜杠(在我的情况下,一个已经由用户/组分隔符生成),因此最多只显示深度为1的文件。您可以尝试将2替换为不同的数字。
我同意leonbloy的回答——在tarball本身内部没有直接实现这个功能的方法。
关于你问题的第二部分,ls
没有最大深度选项。你可以用ls -R
递归地列出所有内容,但这通常没什么用。
不过你可以使用find
和tree
来实现这个功能。例如,要列出一级深度的文件和目录,可以这样做:
find -maxdepth 2
或者
tree -L 2
tree
还有一个 -d
选项,它递归地列出目录而不是文件,我发现这比一般情况下的 -L
更加实用。
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}'
tree
命令以列出多层次的子目录。 - Camerontar -tvf mytar.tar | less
比大多数答案都要简单。 - Superbesttree
支持.tar
文件吗? - brennebeck