bashで解凍せずにリンクされた出力(通常のテキストファイルを含む)とtgzアーカイブのファイル名を読みますか?

bashで解凍せずにリンクされた出力(通常のテキストファイルを含む)とtgzアーカイブのファイル名を読みますか?

gzipで圧縮された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

使用していると仮定牛に似た一種の栄養tartarcat、次の内容でパス名を付けたファイルを作成します。

#!/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

8進数のファイルパターンをデコードして日付/時刻出力を調整することは、読者の練習問題として残ります。

関連情報