Lê a saída concatenada do arquivo tgz (com arquivos de texto simples), com nomes de arquivos, sem descompactar no bash?

2

Eu tenho um monte de arquivos de texto / logs, que eu gostaria de empacotar em um arquivo tar compactado com gzip, dizer:

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

Agora, se eu abrir isso com less test.tgz , receberei uma lista de arquivos igual à 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

Primeiro, eu encontrei o link , e tentei configurar no meu ~/.bashrc :

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

Agora posso fazer tgzless test.tgz , e isso imprime o conteúdo concatenado de todos os arquivos:

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

... mas infelizmente não imprime os nomes dos arquivos, então eu realmente não sei qual parte pertence onde.

Depois, encontrei , e tentei este comando:

gzip -dc test.tgz | less

Agora, isso irá imprimir tanto o cabeçalho de um arquivo quanto o conteúdo do arquivo - infelizmente o cabeçalho do arquivo é binário e difícil de ler - parece algo como isso dentro de less :

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

... por isso é difícil de ler (note que gzip -dc test.tgz | tar -tf - | less fornece apenas uma listagem de nomes de arquivos, embora menos detalhado que tar tzvf )

Então, posso configurar um alias de alguma forma usando esses comandos padrão, que imprimem todo o conteúdo do arquivo em um arquivo tar.gz, de tal forma que primeiro o nome do arquivo seja impresso (de preferência em tar tzvf format, com nome de usuário, permissão e timestamp), e depois o seu conteúdo?

    
por sdaau 29.10.2017 / 03:23

1 resposta

2

Supondo que você esteja usando GNU tar , crie um arquivo chamado tarcat em seu caminho com o seguinte conteúdo:

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

Em seguida, execute 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

Decodificar o modo de arquivo octal e adaptar a saída de data / hora é deixado como um exercício para o leitor.

    
por 29.10.2017 / 14:41

Tags