我有一堆文本文件/日志,我想将其打包到 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
解码八进制文件模式并调整日期/时间输出留给读者作为练习。