파일 이름에 접미사가없는 경우 파일 형식이 어떻게 알려져 있는지 알고 싶습니다.
예를 들어, 이름 myfile
이 지정된 파일은 이진 또는 텍스트로 시작할 수 있습니다. 파일이 이진인지 텍스트인지 시스템은 어떻게 알 수 있습니까?
파일 이름에 접미사가없는 경우 파일 형식이 어떻게 알려져 있는지 알고 싶습니다.
예를 들어, 이름 myfile
이 지정된 파일은 이진 또는 텍스트로 시작할 수 있습니다. 파일이 이진인지 텍스트인지 시스템은 어떻게 알 수 있습니까?
답변:
이 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
"데이터"만 인쇄합니다.
따라서 접미사가 필요하지 않습니다. 잘못 설정하면 어쨌든 접미사가 혼동 될 수 있습니다.
file(1)
하지만 (매우) 다른 구현입니다.
종종 상관하지 않습니다. 그냥 프로그램에 전달하면 해석되거나 해석되지 않습니다. 텍스트 편집기에서 .jpg를 여는 것이 유용하지는 않지만 그렇게 할 수는 없습니다. 파일 이름의 나머지 부분과 마찬가지로 확장자는 사람의 조직 편의를위한 것입니다.
여러 가지 방법으로 유효하게 해석 될 수있는 파일을 구성 할 수도 있습니다. ZIP 파일 형식의 시작 부분에는 파일 끝에 헤더 가 있으므로 다른 항목을 앞에 추가해도 여전히 ZIP 파일로로드됩니다. 이것은 일반적으로 자동 압축 풀기 zip 파일을 만드는 데 사용됩니다.
이 정보는 일반적으로 파일 헤더에 있습니다. 이 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
file
명령은 파일의 내용에서 파일 사용 방법을 추측합니다. 완전하지 않습니다.
file
. 실제로 파일을 분석합니다. 그러나 대부분의 파일 형식은 정렬 헤더로 식별됩니다. 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
ELF 실행 파일의 헤더입니다 (처음 몇 바이트의 / bin / ls). 마찬가지로 #!/bin/bash
ASCII 파일의 맨 위에는 셸 스크립트로 식별됩니다. 또 다른 예 : 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
(
가장 먼저 확인해야 할 것은 커널이 인식하는 하드 코딩 된 파일 형식입니다. 이들은 디렉토리, 문자 특수 파일, 블록 특수 파일, 파이프 특수 파일, 소켓 및 기호 링크와 같은 파일 유형입니다. 이 정보는 파일의 inode에서 가져옵니다. 파일이 일반 파일 인 경우 다음 정보 세트는 패턴을 찾아서 처음 256 바이트에서 가져옵니다. 따라서 텍스트 파일과 C 소스 코드는 해당 바이트를 검사하여 인식됩니다. 또한 유틸리티는 파일 유형을 테스트하고 유효성 검증하는 데 사용되는 매직 번호 도 찾습니다 . 파일에 정보를 추가하여 인식 할 파일 형식을 추가 할 수 있습니다 /etc/magic
. magic(5)
매직 파일의 형식을 보려면 맨 페이지 를 참조하십시오.
이전 구현 (예 : Solaris)에서 파일 /etc/magic
은 인식 된 대부분의 파일 형식을 열거했습니다.
"파일 형식"은 유닉스에서 의미있는 개념이 아니라고 주장합니다.
낡은 메인 프레임 컴퓨터에서는 OS가 순차적 및 색인 순차를 포함한 여러 파일 형식을 지원했습니다. 최신 운영 체제 (Un * x 및 논란의 여지없이 Windows)는 파일 유형 세트를 최소 (실행 파일, 공유 객체 포함)로 줄입니다.
여러 가지 방법으로 유효하게 해석 될 수있는 파일을 구성 할 수도 있습니다.
이미지 설명으로 해석 될 수있는 까다로운 파일 형식이있을 수 있습니다. 텍스트 파일, XML 파일, SOAP 문서 등 형식이 다양하지 않습니다.