读取 tgz 存档的串联输出(带有纯文本文件)和文件名,而无需在 bash 中解压?

读取 tgz 存档的串联输出(带有纯文本文件)和文件名,而无需在 bash 中解压?

我有一堆文本文件/日志,我想将其打包到 gzipped tar 存档中,例如:

cd /tmp
echo "My Content One" > aaa.log
echo "My Content OneA" >> aaa.log
echo "My Content Two" > bbb.log
echo "My Content TwoB" >> bbb.log
tar czvf test.tgz *.log

现在,如果我用 打开它less test.tgz,我会得到一个与给我的文件相同的文件列表tar tzvf test.tgz

-rw-rw-r-- user/user 31 2017-10-29 03:10 aaa.log
-rw-rw-r-- user/user 31 2017-10-29 03:10 bbb.log

首先,我发现https://www.serverwatch.com/tutorials/article.php/3798511/Reading-compressed-Files-With-less.htm,并尝试在我的中进行设置~/.bashrc

 alias tgzless='LESSOPEN="|tar --to-stdout -zxf %s" less'

现在我可以这样做tgzless test.tgz,这会打印所有文件的串联内容:

My Content One
My Content OneA
My Content Two
My Content TwoB

...但不幸的是没有打印文件名,所以我真的不知道哪个部分属于哪里。

然后,我发现如何查看 tar.gz 文件的内容(文件名 + 文件大小),并尝试了这个命令:

gzip -dc test.tgz | less

现在,这将打印文件标题和文​​件内容 - 不幸的是,文件标题是二进制的并且难以阅读 - 它的内部看起来像这样less

aaa.log^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@0000664^@0001750^@0001750^@00000000037^@131752
34246^@014636^@ 0^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ustar  
^@user^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@user^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@My Content One
My Content OneA
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
...

...所以很难阅读(请注意,它只gzip -dc test.tgz | tar -tf - | less给出了文件名列表,尽管比 更详细tar tzvf

那么我可以使用这些标准命令以某种方式设置别名,这将打印 tar.gz 存档中的所有文件名内容,这样首先打印文件的文件名(最好采用tar tzvf格式,带有用户名、权限和时间戳),然后那么它的内容呢?

答案1

假设你正在使用GNUtar,创建一个以您的路径命名的文件,tarcat其中包含以下内容:

#!/bin/sh

# Permissions user/group size date time name
printf "%s %s/%s %7d %s %s\n" "${TAR_MODE}" "${TAR_UNAME}" "${TAR_GNAME}" "${TAR_SIZE}" "$(date -d @${TAR_ATIME})" "${TAR_FILENAME}"

exec cat

然后运行tar x --to-command=tarcat -f test.tgz | less

0664 user/user      31 Sun 29 Oct 03:10:00 UTC 2017 aaa.log
My Content One
My Content OneA
0664 user/user      31 Sun 29 Oct 03:10:00 UTC 2017 bbb.log
My Content Two
My Content TwoB

解码八进制文件模式并调整日期/时间输出留给读者作为练习。

相关内容