我需要计算存档文件(例如 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
使用 GNUtar
或bsdtar
,您可以使用:
tar tvf file.tar | grep -c '^d'
tar
GNU和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'
会更便携,但可能会因包含换行符的文件名而失败。