确定 tar 文件内的目录数而不解压它

确定 tar 文件内的目录数而不解压它

我需要计算存档文件(例如 tar.bz)内的目录数,而不提取存档。请注意,存档太大,因此很难提取然后使用 计算目录ls | wc -l

答案1

这应该列出存档中的所有文件,然后找到以/(folders) 结尾的行,然后计算其行数:

tar -tvf file.tar | grep -c '/$'

编辑:如果您只想计算顶级目录:

tar --exclude='./*/*' -tvf file.tar | grep -c '/$'

如果你想递归地更深一层:

tar --exclude='./*/*/*' -tvf file.tar | grep -c '/$'

等等...

答案2

在所有情况下都能正确工作的唯一方法是使用star -find

star -t -v -f file.tar -find -type d | wc -l

在所有情况下都有效,即使目录名称不以斜杠结尾。在目录名称后面附加斜杠的肮脏技巧是在 1980 年左右引入的,当时 tar 格式还不知道文件类型“目录”。 POSIX 不需要它,并且有一些 tar 实现不会将斜杠附加到目录名称中。

请注意,您可能需要 grep for'^ 0 d'以确保仅在路径名包含换行符的情况下计算实际列表行的开头,或者使用:

star -t -f file.tar -find -type d -print0 -false

然后计算输出中 nul 字符的数量,例如通过将输出管道传输到:

LC_ALL=C tr -cd '\0' | wc -c

答案3

使用 GNUtarbsdtar,您可以使用:

tar tvf file.tar | grep -c '^d'

tarGNU和GNU 都bsdtar将文件类型作为长列表输出 ( ) 中行的第一个字符,tv其方式与ls -l和 在文件名中渲染换行符类似\n,因此如果存档成员名称包含换行符,则仍然有效。

这比寻找尾随/字符更可靠就像 @schily 所说的那样,不保证一定会在那里

POSIXly,您可以使用:

pax -o listopt=%.1M < file.tar | grep -cx d

尽管-o listopt并非所有实现都支持这一点pax,特别是http://www.mirbsd.org/pax.htmpax 在 Ubuntu 上找到。

pax -v < file.tar | grep -c '^d'

会更便携,但可能会因包含换行符的文件名而失败。

相关内容