파일 접미사가 아닌 경우 파일 형식을 어떻게 알 수 있습니까?


55

파일 이름에 접미사가없는 경우 파일 형식이 어떻게 알려져 있는지 알고 싶습니다.

예를 들어, 이름 myfile이 지정된 파일은 이진 또는 텍스트로 시작할 수 있습니다. 파일이 이진인지 텍스트인지 시스템은 어떻게 알 수 있습니까?


3
단지 의견, 나머지 답변은 모든 것을 다룹니다. 요즘 잘못 구성된 로케일 또는 오래된 실행 파일을 사용하면 ASCII 이외의 바이트로 인해 일부 utf-8 파일이 이진 데이터로 잘못 감지 될 수 있습니다.
오리온

19
시스템은 상관하지 않습니다. 일부 응용 프로그램은 문제가 될 수 있지만 각각 자체 처리 방법이 있습니다.
jwodder

2
장치 파일, 유닉스 도메인 소켓, 명명 된 파이프 등이 아닌 일반 파일의 경우에도 "파일 형식"은 다음 두 가지를 의미 할 수 있습니다. (1) 특정 파일 형식 ( ".docx", XML, MS-DOS 텍스트 형식 , RTF, 고정 길이 레코드, 목록이 매우 길 수 있음) 또는 (2) 특정 앱이 처리하는 방법을 알고있는 파일 ( ".xlsx"또는 ".doc"또는 형식 유형과 겹치는 부분) . "파일 형식"에 대해 이야기 할 때 그 차이점을 명심해야합니다.
Bruce Ediger

@jwodder 시스템이 관리합니다. 실행하려고 할 때 실행 파일이 아닌 파일을 실행할 수 없다고 불평하는 시스템입니다.
Mr Lister

1
@MrLister True, 그러나 실행 / 실행 불가능은 '확장'과 관련이 없습니다.
user2338816 2016

답변:


84

file유틸리티는 3 가지 방법으로 파일 유형을 결정합니다.

먼저 파일 시스템 테스트 : 해당 테스트 내에서 stat 제품군 시스템 호출 중 하나가 파일에서 호출됩니다. 일반 파일, 디렉토리, 링크, 문자 장치, 블록 장치, 명명 된 파이프 또는 소켓 등 다른 유닉스 파일 형식을 반환합니다 . 그것에 따라, 마법 테스트가 이루어집니다.

마법 테스트는 조금 더 복잡하다. 파일 유형은 매직 파일 이라는 패턴의 데이터베이스로 추측됩니다 . 일부 파일 형식은 파일 내의 특정 위치 (예 : 이진)에서 비트 또는 숫자를 읽어서 확인할 수 있습니다. 매직 파일에는 파일의 포함 여부와 인쇄 할 텍스트 정보를 테스트하기 위해 " 마법 번호 "가 포함됩니다. 이러한 " 마법 숫자 "는 1-4 바이트 값, 문자열, 날짜 또는 정규식 일 수 있습니다. 추가 테스트를 통해 추가 정보를 찾을 수 있습니다. 실행의 경우, 추가 정보가 있는지 여부 것 동적으로 링크 여부, 제거또는 건축술. 파일 유형을 실제로 식별하기 전에 여러 테스트를 통과해야하는 경우가 있습니다. 그러나 어쨌든, 얼마나 많은 테스트를 수행하든 상관없이 항상 좋은 추측 입니다.

다음은 일반적인 파일 형식의 파일에서 처음 8 바이트로,이 매직 넘버가 어떻게 생겼는지에 대한 느낌을 얻는 데 도움이 될 수 있습니다.

             Hexadecimal          ASCII
PNG   89 50 4E 47|0D 0A 1A 0A   ‰PNG|....
JPG   FF D8 FF E1|1D 16 45 78   ÿØÿá|..Ex
JPG   FF D8 FF E0|00 10 4A 46   ÿØÿà|..JF
ZIP   50 4B 03 04|0A 00 00 00   PK..|....
PDF   25 50 44 46|2D 31 2E 35   %PDF|-1.5

매직 테스트에서 파일 형식을 찾을 수없는 경우 파일은 텍스트 파일 인 것 같 file으며 내용의 인코딩을 찾습니다. 인코딩은 각 세트에서 인쇄 가능한 텍스트를 구성하는 다양한 범위와 바이트 시퀀스로 구별됩니다.

HEX 값에 따라 줄 바꿈도 조사합니다.

  • 0A( \n)는 Un * x / Linux / BSD / OSX 종료 파일을 분류합니다
  • 0D 0A( \r\n)는 Microsoft 운영 체제의 파일입니다.
  • 0D( \r)는 버전 9까지 Mac OS입니다.
  • 15( \025)는 IBM의 AIX입니다.

이제 언어 테스트가 시작됩니다. 텍스트 파일 인 경우 파일에서 특정 문자열을 검색하여 포함 된 언어 (C, Perl, Bash)를 찾습니다. 일부 스크립트 언어는 스크립트 의 첫 번째 행에서 해시 뱅 ( #!/bin/interpreter)을 통해 식별 될 수도 있습니다 .

파일에 아무 것도 적용되지 않으면 파일 형식을 결정할 수 없으며 file"데이터"만 인쇄합니다.

따라서 접미사가 필요하지 않습니다. 잘못 설정하면 어쨌든 접미사가 혼동 될 수 있습니다.


4
freedesktop.org 공유 MIME 데이터베이스도 있습니다.이 데이터베이스는 기본적으로 모든 X11 응용 프로그램에서 사용됩니다. 이것은 개념 상 동작과 비슷 file(1)하지만 (매우) 다른 구현입니다.
lcd047

4
이 과정의 결과는 기본적으로 추측이며 중요한 것에 의존해서는 안됩니다. (편리한 기능, 사용하여 파일을 열려면 기본 프로그램을 결정처럼 괜찮)
user253751

따라서 텍스트 파일 맨 위에 % PNG를 추가하면 png 파일로 표시됩니다. 권리??
saga

@saga 만약 당신이 인코딩을 올바르게하고 퍼센트 부호 대신에 밀 부호를 붙이면 : 아마도. 추가 테스트가있을 수 있습니다.
Bananguin

19

종종 상관하지 않습니다. 그냥 프로그램에 전달하면 해석되거나 해석되지 않습니다. 텍스트 편집기에서 .jpg를 여는 것이 유용하지는 않지만 그렇게 할 수는 없습니다. 파일 이름의 나머지 부분과 마찬가지로 확장자는 사람의 조직 편의를위한 것입니다.

여러 가지 방법으로 유효하게 해석 될 수있는 파일을 구성 할 수도 있습니다. ZIP 파일 형식의 시작 부분에는 파일 끝에 헤더 가 있으므로 다른 항목을 앞에 추가해도 여전히 ZIP 파일로로드됩니다. 이것은 일반적으로 자동 압축 풀기 zip 파일을 만드는 데 사용됩니다.


4
마지막 단락 : 펑키 파일 형식 은 그 주제에 대한 흥미로운 이야기입니다. 예를 들어 자바 헬로 월드 프로그램이기도 한 jpeg를 제시합니다. 모든뿐만 아니라 화이트 노이즈 또는 유물)로 즉, "재미있는"내용과
하겐 폰 Eitzen

14

이 정보는 일반적으로 파일 헤더에 있습니다. 이 file명령은 대상을 분석하고 파일에 대한 정보를 알려줍니다. 많은 정보는 종종 파일의 처음 몇 바이트에 해당하는 파일 헤더에서 파생됩니다 (아래 참조). 헤더는 시스템에서 파일을 처리하는 방법을 파악하는 데 사용됩니다. #!/bin/bash파일의 시작 부분에서 bash 쉘을 사용하여 다음 스크립트를 해석하도록 시스템에 지시합니다. ELF이것이 ELF 실행 파일임을 시스템에 알려줍니다.

[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

[~] root@www # file /etc/passwd
/etc/passwd: ASCII text

파일 헤더 예 :

[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c  ...4...o.....b.<

[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000  ..>......$@.....

[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a  #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20   "$1" ] && echo

3
오히려 오해의 소지가 있습니다. 유닉스 파일에는 "헤더"자체가 없습니다. 이 file명령은 파일의 내용에서 파일 사용 방법을 추측합니다. 완전하지 않습니다.
Nate Eldredge 2016 년

의 동작을 어떻게 설명했는지에 대해 귀하는 옳습니다 file. 실제로 파일을 분석합니다. 그러나 대부분의 파일 형식은 정렬 헤더로 식별됩니다. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ELF 실행 파일의 헤더입니다 (처음 몇 바이트의 / bin / ls). 마찬가지로 #!/bin/bashASCII 파일의 맨 위에는 셸 스크립트로 식별됩니다. 또 다른 예 : 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR(
a.png

2
그러나 귀하의 답변은 헤더가 Unix 파일의 고유 기능인 것처럼 들립니다. 예를 들어, 텍스트 파일에는 그러한 헤더가 없습니다. OP와 같은 누군가는 아마도 C 소스 파일과 Java 소스 파일이 다른 "파일 형식"을 갖는 것으로 간주하지만 구별 할 헤더는 없습니다. "파일 형식"은 유닉스에서 의미있는 개념이 아니라고 주장합니다. 운영 체제는 파일 시스템 만 제공하며 주어진 파일의 내용이 무엇을 의미하는지 결정하는 것은 각 응용 프로그램에 달려 있습니다.
Nate Eldredge 2016 년

동의한다. 나는 토끼 구멍을 너무 많이 쓰러 뜨리지 않고 가능한 한 간단하게 답변하려고 노력했습니다.
h3rrmiller

7

가장 먼저 확인해야 할 것은 커널이 인식하는 하드 코딩 된 파일 형식입니다. 이들은 디렉토리, 문자 특수 파일, 블록 특수 파일, 파이프 특수 파일, 소켓 및 기호 링크와 같은 파일 유형입니다. 이 정보는 파일의 inode에서 가져옵니다. 파일이 일반 파일 인 경우 다음 정보 세트는 패턴을 찾아서 처음 256 바이트에서 가져옵니다. 따라서 텍스트 파일과 C 소스 코드는 해당 바이트를 검사하여 인식됩니다. 또한 유틸리티는 파일 유형을 테스트하고 유효성 검증하는 데 사용되는 매직 번호 도 찾습니다 . 파일에 정보를 추가하여 인식 할 파일 형식을 추가 할 수 있습니다 /etc/magic. magic(5)매직 파일의 형식을 보려면 맨 페이지 를 참조하십시오.

이전 구현 (예 : Solaris)에서 파일 /etc/magic은 인식 된 대부분의 파일 형식을 열거했습니다.


4

file명령은 파일을 검사하고 (일부) 자격을 갖춘 추측을함으로써 휴리스틱을 적용합니다. 추가 정보를 얻을 수있는 특별한 경우가 있습니다. 등 #!텍스트 파일의 시작 부분에서, BOM (바이트 순서 표시), 또는 실행 파일 형식의 특정 헤더 바이트. #!실행 파일 의 및 이진 표시는 시스템에서이를 구별하기 위해 사용합니다.


4

시스템은 파일이 이진인지 텍스트인지 알 수 없습니다. 모든 (AFAIK) 유닉스 형 운영 시스템에서 fopen(path, "rb")정확히 동일하다 fopen(path "r")- (가) b아무런 영향을 미치지 않습니다. 표준 C는 그러한 차이를 만드는 다른 OS에 이식 가능해야하기 때문에 받아 들여집니다.


0

"파일 형식"은 유닉스에서 의미있는 개념이 아니라고 주장합니다.

낡은 메인 프레임 컴퓨터에서는 OS가 순차적 및 색인 순차를 포함한 여러 파일 형식을 지원했습니다. 최신 운영 체제 (Un * x 및 논란의 여지없이 Windows)는 파일 유형 세트를 최소 (실행 파일, 공유 객체 포함)로 줄입니다.

여러 가지 방법으로 유효하게 해석 될 수있는 파일을 구성 할 수도 있습니다.

이미지 설명으로 해석 될 수있는 까다로운 파일 형식이있을 수 있습니다. 텍스트 파일, XML 파일, SOAP 문서 등 형식이 다양하지 않습니다.


1
파일 형식이 바뀌면서 XPM은 까다 롭지 않습니다. "tricky"가 유효한 JPEG 및 유효한 ZIP 파일 인 것으로 시작하는 것을 고려합니다.
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.