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

파일 의 경우 GNU를 사용하여 즉시 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구성원 의 내용은 메모리에 전체적으로 저장되지도 않습니다.tartarfile

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

효율성 관점에서 볼 때 최적이 아닌 경우는 각 일반 파일 아카이브 구성원에 대해 하나 sh(명령줄 해석을 위해 exec file -b -)와 하나의 명령을 실행한다는 것입니다. file우리는 exec동일한 프로세스가 sh및 에 대해 재사용되도록 사용합니다(이와 같은 구현 file의 경우 자체적으로 최적화를 수행하지 않음).shdash

답변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그러나 아카이브 내부의 파일에 대해서는 압축을 풀고 각 파일을 개별적으로 실행해야 합니다 .

관련 정보