파일 이름에 접미사가 없는 경우 파일 형식을 아는 방법을 알고 싶습니다.
예를 들어, 이름이 지정된 파일은 myfile
바이너리 또는 텍스트로 시작할 수 있습니다. 시스템은 파일이 바이너리인지 텍스트인지 어떻게 알 수 있습니까?
답변1
이것file
유틸리티는 다음 세 가지 방법으로 파일 형식을 결정합니다.
가장 먼저파일 시스템 테스트: 이 테스트 중 하나에서통계자료일련의 시스템 호출이 파일에 대해 호출됩니다. 이는 다른 결과를 반환합니다.UNIX 파일 유형: 일반 파일, 디렉토리, 링크, 문자 장치, 블록 장치, 명명된 파이프 또는 소켓. 그에 따라 마법 테스트를 수행합니다.
이것마술 테스트조금 복잡합니다. 파일 형식은 스키마라는 데이터베이스를 통해 추측됩니다.매직 파일. 일부 파일 형식은 파일의 특정 위치(예: 이진 파일)에서 비트나 숫자를 읽어 결정될 수 있습니다. 매직 파일에는 "매직넘버"파일에 해당 내용이 포함되어 있는지, 어떤 텍스트 정보가 인쇄되어야 하는지 테스트합니다. 그"매직넘버"는 1-4Byte 값, 문자열, 날짜 또는 정규 표현식일 수 있습니다. 추가 테스트를 통해 추가 정보를 찾을 수 있습니다. 실행 파일인 경우 추가 정보는 파일이 실행 파일인지 여부입니다.동적 링크아니면,벗겨진아니면 건축이 아닙니다. 파일 형식을 실제로 식별하려면 여러 테스트를 통과해야 하는 경우도 있습니다. 하지만 어쨌든 몇 번 테스트를 하든 상관없이 항상 좋은 결과가 나온다.추측하다.
다음은 마법의 숫자가 어떻게 생겼는지 이해하는 데 도움이 되는 몇 가지 일반적인 파일 형식에 대한 파일의 처음 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
콘텐츠의 인코딩을 찾습니다. 인코딩은 각 그룹에서 인쇄 가능한 텍스트를 구성하는 다양한 범위와 바이트 시퀀스로 구별됩니다.
개행 문자도 16진수 값을 기준으로 연구됩니다.
0A
(\n
) Un*x/Linux/BSD/OSX 종료 파일 분류0D 0A
(\r\n
)는 Microsoft 운영 체제의 파일입니다.0D
(\r
)는 버전 9 이전의 Mac 운영 체제용입니다.15
(\025
)는 IBM의 AIX이다.
지금언어 테스트시작. 텍스트 파일인 경우 파일에 특정 문자열이 포함되어 있는지 검색하여 해당 파일에 포함된 언어(C, Perl, Bash)를 찾습니다. 일부 스크립팅 언어는 다음을 통해 사용할 수도 있습니다.해시본( #!/bin/interpreter
) 스크립트의 첫 번째 줄에 있습니다.
파일에 적용되는 내용이 없으면 파일 형식을 확인할 수 없으며 file
"데이터"만 인쇄됩니다.
따라서 접미사가 필요하지 않습니다. 잘못 설정하면 접미사가 혼란을 야기할 수 있습니다.
답변2
많은 경우에는 상관하지 않습니다. 프로그램에 전달하면 프로그램이 해석하거나 해석하지 않습니다. 텍스트 편집기에서 .jpg를 열면 작동하지 않을 수도 있지만 열 수는 있습니다. 파일 이름의 나머지 부분과 마찬가지로 확장자는 조직의 편의를 위한 것입니다.
다양한 방식으로 효과적으로 해석될 수 있는 문서를 구성하는 것도 가능합니다. ZIP 파일 형식은 헤더로 시작하기 때문에파일 끝에서, 앞에 다른 콘텐츠를 추가할 수 있으며 여전히 ZIP 파일로 로드됩니다. 이는 일반적으로 자동 압축 풀기 zip 파일을 만드는 데 사용됩니다.
답변3
이 정보는 일반적으로 파일 헤더에서 찾을 수 있습니다. 이 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
답변4
이 file
명령은 파일(일부)을 검사하고 검증된 추측을 하여 몇 가지 경험적 방법을 적용합니다. 이 외에도 #!
텍스트 파일 시작 부분의 특정 헤더 바이트, BoM(바이트 순서 표시) 또는 실행 파일 형식과 같은 일부 특수한 경우에 추가 정보를 얻을 수 있습니다. #!
시스템은 실행 파일에서 및 바이너리 태그를 사용하여 이를 구별합니다.