非递归 tar 列表

非递归 tar 列表

我有一个 tar 存档文件,其中包含一个包含大量文件的目录,我希望仅列出该目录而不解压它(以尽快知道该目录的文件名)。
我执行了:

tar -tf filename.tar.gz

当我只需要目录时,执行会递归输出。
我怎样才能“过滤”该目录?

答案1

要从存档的顶层获取所有名称tar

tar -tf archive.tar | cut -d '/' -f 1 | sort -u

这将列出存档的内容并删除/每行之前的第一位。对结果进行排序并删除重复项。如果存档仅包含一个顶级目录(其中可能包含文件和子目录),则结果将是该目录的名称。

如果顶级名称包含换行符,那么结果将取决于所tar使用的实现(您将得到一个带有 GNU 编码换行符 ( \n)的字符串tar(GNUtar同样会对名称中的制表符和可能的其他字符进行编码),并且来自 BSD 的两个单独的字符串tar)。

例子:

$ tar -tf archive.tar
README.txt
source
source/program.c
$ tar -tf archive.tar | cut -d '/' -f 1 | sort -u
README.txt
source

同样,如果存档在其最上层仅包含一个目录,则这将返回其名称。

答案2

举例来说gnuchess-6.2.5.tar.gz,仅获取根目录名称:

[David@Fedora64 projects]$ tar -tf gnuchess-6.2.5.tar.gz | grep -e "\/$" | head -n1
gnuchess-6.2.5/
[David@Fedora64 projects]$ 

如果这没有任何作用,就像结构类似的文件一样mediawiki-1.33.0.tar.gz,您只需查看文件的第一行即可获取根目录名称tar

[David@Fedora64 Downloads]$ tar -tf mediawiki-1.33.0.tar.gz | head -n1
mediawiki-1.33.0/.phan/config.php
[David@Fedora64 Downloads]$ 

...根目录被视为mediawiki-1.33.0.

答案3

$ tar -tf mytar.tar | tree -L 1 --fromfile # show top level

相关内容