파일 접미사를 사용하지 않고 파일 형식을 어떻게 알 수 있나요?

파일 접미사를 사용하지 않고 파일 형식을 어떻게 알 수 있나요?

파일 이름에 접미사가 없는 경우 파일 형식을 아는 방법을 알고 싶습니다.

예를 들어, 이름이 지정된 파일은 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(바이트 순서 표시) 또는 실행 파일 형식과 같은 일부 특수한 경우에 추가 정보를 얻을 수 있습니다. #!시스템은 실행 파일에서 및 바이너리 태그를 사용하여 이를 구별합니다.

관련 정보