zip 또는 tar.gz 파일에 있는 파일의 실제 파일 형식을 어떻게 알 수 있나요?

zip 또는 tar.gz 파일에 있는 파일의 실제 파일 형식을 어떻게 알 수 있나요?

.tar.gz 및 .zip 파일이 여러 개 있는데 압축을 풀지 않고도 이러한 파일에 포함된 파일 형식을 알고 싶습니다. 어떻게 해야 하나요? 명령을 사용하여 tar -tzf 'filename'.tar.gz 파일을 나열할 수 있습니다 unzip -l 'filename'. 이 파일에서 파일 형식을 식별하는 방법을 찾을 수 없습니다. 이 목표를 어떻게 달성할 수 있나요? 센토스 6.6을 사용하고 있습니다

명령 출력tar -tzf 'test.tar.gz'

-rw-r--r-- root/root     89403 2019-05-26 11:31 abc.tar.gz
-rw------- root/root      2842 2019-05-26 09:41 anaconda-ks.cfg
-rw-r--r-- root/root      8823 2019-05-26 09:41 install.log
-rw-r--r-- root/root      3314 2019-05-26 09:40 install.log.syslog
-rw-r--r-- root/root    122880 2019-05-26 11:28 tin.tar
-rw-r--r-- root/root     25543 2019-05-26 11:20 tito.zip
-rw-r--r-- root/root     25487 2019-05-27 07:48 tito.ZIP

산출unzip -l test.zip

 Length      Date    Time    Name
---------  ---------- -----   ----
    89403  05-26-2019 11:31   abc.tar.gz
     2842  05-26-2019 09:41   anaconda-ks.cfg
     8823  05-26-2019 09:41   install.log
     3314  05-26-2019 09:40   install.log.syslog
   122880  05-26-2019 11:28   tin.tar
    25543  05-26-2019 11:20   tito.zip
    25487  05-27-2019 07:48   tito.ZIP
---------                     -------
   278292                     7 files

답변1

GNU 사용 tar:

tar --to-command='exec file -b -' -xvvf file.tar.gz

파일의 경우 다음 명령을 사용하여 zip즉시 변환하고 GNU를 다시 사용하여 각 구성원을 호출할 수 있습니다.tarbsdtartarfile

bsdtar cf - @file.zip | tar --to-command='exec file -b -' -xvvf -

다음과 같은 출력이 제공됩니다.

-rw-rw-r-- 0/0            7653 1999-12-30 10:26 WINOBJ.HLP
MS Windows 3.1 help, Thu Dec 30 15:26:17 1999, 7653 bytes
-rw-rw-r-- 0/0            7005 2006-07-28 08:32 Eula.txt
Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators
-rw-rw-r-- 0/0          729464 2011-02-14 11:37 Winobj.exe
PE32 executable (GUI) Intel 80386, for MS Windows

명령 file은 추측합니다유형파일의 처음 몇 바이트를 기반으로 휴리스틱을 사용하여 파일을 구문 분석합니다. 따라서 무슨 일이 있어도 파일에서 데이터를 추출해야 합니다. tar tvf출력을 보고하는 경우에도 tar각 아카이브 멤버의 콘텐츠 앞에 정보가 저장되기 때문에 전체 아카이브를 읽고 압축을 풀어야 하지만 위 솔루션 중 어느 것도 멤버를 추출하지 않습니다.디스크에, 데이터는 파이프를 통해 앞뒤로 전달되며 bsdtar아카이브 tar구성원의 내용은 메모리에 전체적으로 저장되지도 않습니다.tarfile

file파일의 처음 몇 바이트를 읽고 반환한 후 GNU는 tar이를 현명하게 처리하고 다음 아카이브 멤버에 대해 다음 명령을 실행하기 전에 (SIGPIPE에서 죽는 대신) 아카이브 멤버의 나머지 부분을 건너뜁니다 file.

sh효율성 관점에서 보면 하나의 명령 (해석된 exec file -b -명령줄)과 각 일반 파일 아카이브 구성원에 대해 하나의 명령을 실행하므로 최적이 아닙니다 . file우리는 exec재사용을 위해 동일한 프로세스를 사용 sh합니다 file(이와 같은 경우 sh구현 dash자체는 최적화되지 않습니다).

답변2

file명령은 파일 자체에 대한 정보를 알려줍니다.

$ file test.zip
test.zip: Zip archive data, at least v1.0 to extract
$ file test.tar.gz
test.tar.gz: gzip compressed data, last modified: Sun May 26 11:28:34 2019, from Uniz

그러나 아카이브에 있는 파일의 경우 해당 파일을 추출하고 file각각을 개별적으로 실행해야 합니다.

관련 정보