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사용자 이름, 권한 및 timestamp ), 그 내용은 어떻습니까?

답변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진수 파일 패턴을 디코딩하고 날짜/시간 출력을 조정하는 것은 독자의 연습 문제로 남겨집니다.

관련 정보