파일을 분류하는 Linux 파일 명령


17

임의의 파일에 포함 된 데이터 유형을 인식해야합니다. 저는 Linux를 처음 사용합니다.

file파일에 어떤 유형의 데이터가 있는지 이해 하기 위해 명령 을 사용할 계획 입니다. 그 명령을 시도하고 아래 출력을 얻었습니다.

누군가 나에게 file명령이 파일의 초기 바이트를보고 데이터 유형을 결정 하도록 제안했습니다 . 이 file명령은 파일 확장자를 전혀 보지 않습니다. 그 맞습니까? 나는 보았다 man 페이지를 하지만 너무 기술적 인 것을 느꼈다. 누구든지 file명령이 어떻게 작동 하는지에 대한 훨씬 간단한 설명이있는 링크를 제공 할 수 있다면 고맙겠습니다 .

file명령 을 실행 한 후에 얻을 수있는 다른 가능한 답변은 무엇입니까 ? 예를 들어 아래 성적표에는 JPEG, ISO 미디어, ASCII 등이 있습니다.

화면 출력은 다음과 같습니다

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


업데이트 1

답변 주셔서 감사합니다 그리고 그들은 나를 위해 몇 가지를 명확하게했다.

따라서 폴더를 올바르게 이해하면 / usr / share / mime / magic에는 현재 가능한 파일 형식 (파일 명령을 입력하고 파일로 가져올 때 얻을 수있는 출력)이 무엇인지 알려주는 데이터베이스가 있습니다. 그 맞습니까? 'File'명령 출력에 "text"라는 단어가 포함될 때마다 텍스트 뷰어로 읽을 수있는 것을 의미하고 "text"가없는 것은 바이너리의 일종이라는 것이 사실입니까?


6
앞으로 터미널 출력 그림을 게시하는 것은 실제로 권장되지 않습니다 (또는 다른 사람이 즐기는 것). 마크 다운 코드 블록 형식을 사용하십시오.
HalosGhost

3
그림을 제거하고 코드를 게시했습니다.
user2543622

참고로 : 파일이 파일을 식별 할 수없는 경우 종종 TrID 가 파일을 식별 할 수 있습니다. 커뮤니티는 파일 특성을 사용하여 작성된 고유 한 파일 특성 데이터베이스를 가지고 있습니다.
Josef는 Reinstate Monica

답변:


13

file 여러 종류의 테스트를 사용합니다 .

1 : 파일 이 존재하지 않거나 읽을 수 없거나 파일 상태를 판별 할 수없는 경우 출력은 파일이 처리되었지만 파일 유형을 판별 할 수 없음을 표시해야합니다.

이것은 다음과 같이 출력 cannot open file: No such file or directory됩니다.

2 : 파일이 일반 파일이 아닌 경우 파일 형식을 식별해야합니다. 파일 유형 디렉토리, FIFO, 소켓, 블록 스페셜 및 문자 스페셜은 이와 같이 식별되어야합니다. 다른 구현 정의 파일 형식도 식별 할 수 있습니다. 파일이 심볼릭 링크 인 경우 기본적으로 링크가 해결되고 파일은 심볼릭 링크가 참조하는 파일 형식을 테스트해야합니다. ( 아래 -h-i옵션을 참조하십시오 .)

이것은 .: directoryand 처럼 출력됩니다 /dev/sda: block special. 이것과 이전 지점의 많은 형식은 POSIX에 의해 부분적으로 정의됩니다 . 출력에있는 특정 문자열에 의존 할 수 있습니다.

3 : 파일 길이가 0이면 빈 파일로 식별됩니다.

이것은입니다 foo: empty.

4 : 파일 유틸리티는 파일의 초기 세그먼트를 검사하고 위치 감지 테스트를 기반으로 파일의 내용을 식별해야합니다. (정답은 보장되지 않습니다. 아래의 -d, -M 및 -m 옵션을 참조하십시오.)

5 : 파일 유틸리티는 파일을 검사하고 상황에 맞는 기본 시스템 테스트를 기반으로 파일 내용을 식별합니다. (답은 정확하지 않을 수 있습니다.)

이 두 가지는 매직 넘버 식별을 사용 하며 명령에서 가장 흥미로운 부분입니다. 매직 번호는 식별의 유형이 파일에 알려진 장소에서의 바이트의 특별 순서입니다. 전통적으로 그 장소는 처음 2 바이트이지만 더 긴 문자열과 다른 위치를 포함하도록이 용어가 더 확장되었습니다. 명령의 마법 번호에 대한 자세한 내용은 이 다른 질문 을 참조하십시오 file.

file명령에는 이러한 숫자의 데이터베이스와 그에 해당하는 유형이 있습니다. 해당 데이터베이스는 일반적으로 /usr/share/mime/magic파일 내용을 MIME 유형에 매핑합니다 . 출력은 ( file -i기본적으로 얻지 못하는 경우의 일부 ) 정의 된 미디어 유형 또는 확장입니다. "상황에 맞는 테스트"는 같은 종류의 접근 방식을 사용하지만 약간 어지럽습니다. 이것들 중 어느 것도 옳다고 보장되지는 않지만, 좋은 추측이되도록 의도되었습니다.

file또한 이러한 유형을 이름에 매핑하는 데이터베이스가 있으며이를 통해 식별 된 파일이 application/pdf로 설명 될 수 있음 을 알게 됩니다 PDF document. 사람이 읽을 수있는 이름은 다른 언어로도 현지화 될 수 있습니다. 이것들은 항상 기계보다는 사람이 이해하는 방식으로 파일 형식에 대한 높은 수준의 설명입니다.

얻을 수있는 다양한 출력의 대부분은이 단계에서 나옵니다. magic지원되는 유형의 목록과 식별 방법을 파일 에서 확인할 수 있습니다. 내 시스템은 376 가지 유형을 알고 있습니다. 주어진 이름과 지원되는 유형은 시스템 패키징 및 구성에 따라 결정되므로 시스템이 내 것보다 많거나 적을 수 있지만 일반적으로 많은 것이 있습니다. libmagic또한 하드 코딩 된 추가 테스트도 포함됩니다.

6 : 파일은 데이터 파일로 식별되어야합니다.

이다 foo: data는 파일에 대해 전혀 아무것도 알아낼 실패했을 때.

나타날 수있는 다른 작은 태그도 있습니다. 실행 파일 ( +x) executable은 쉼표로 구분 된 출력에 " "를 포함 합니다. file구현은 또한 "같이 그들에 대해 추가 점을 설명 할 수있는 몇 가지 파일 형식에 대한 별도의 일을 알 수 있습니다 PDF document, version 1.4."


8

매뉴얼 페이지는 일반적으로 소개가 아니라 간결한 참조입니다. Wikipedia 페이지로 시작 하십시오 .

file파일 이름이 아닌 파일 내용 만 봅니다. (또한 파일 형식과 같은 일부 파일 메타 데이터 (디렉토리, 기호 링크, 명명 된 파이프 등)도 살펴 봅니다. 관심이있는 경우 중요한 내용입니다.)

file일반적으로 처음 몇 바이트를보고 내장 된 매직 넘버 테이블과 비교하여 파일 형식을 추측합니다 . 파일로 시작하는 경우 예를 들어 %PDF, 다음 file"PDF 문서"를보고 (최소 버전을보고 더 파고 간다). 매직 번호로 시작하지 않는 파일 유형의 경우, 추론이 포함됩니다. 예를 들어 처음 몇 바이트가 모두 인쇄 가능한 ASCII 범위에 있으면 "ASCII 텍스트"를보고하십시오.

출력 결과 file는 취약합니다. 유닉스 변형과 유닉스 변형, 버전마다 다를 수 있습니다. Linux, Cygwin 및 * BSD에서이 file명령은 MIME 미디어 유형-i 의 형태로 예측 가능한 출력을 생성 하는 옵션 을 지원합니다 (IANA는 표준 미디어 유형 목록 관리 ). 세부 사항은 많지 않으며 출력은 인간 친화적이지 않지만 출력은 예측 가능하고 컴퓨터 친화적입니다.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

file --mime-type인코딩 정보없이 MIME 유형 자체 만 원하는 경우 사용하십시오 ( 예 :) application/pdf. -b줄의 시작 부분에 파일 이름을 표시하지 않으려면 옵션 을 전달하십시오.


5

나는 당신이 여기 에서 답변을 읽고 싶습니다 . 답변에서 발췌 한 일부 내용은

file명령 매뉴얼 페이지 에서

file 명령은 실제로 파일 유형을 결정하는 3 가지 테스트를 수행합니다.

첫 번째 테스트

파일 시스템 테스트는 stat (2) 시스템 호출의 리턴 검사를 기반으로합니다.

두 번째 테스트

매직 넘버 테스트는 특정 고정 형식의 데이터가있는 파일을 확인하는 데 사용됩니다.

세 번째 테스트

언어 테스트는 파일의 처음 몇 블록에서 나타날 수있는 특정 문자열 (cf names.h)을 찾습니다. 예를 들어 키워드 .br은 키워드 struct가 C 프로그램을 나타내는 것처럼 파일이 troff (1) 입력 파일 일 가능성이 높습니다.

file명령 의 출력 은 일반적으로 성공한 테스트 결과를 기반으로합니다.

이제 C ++ 프로그램이 이와 같이 시작되고 세 번째 테스트가 성공한다고 가정하면,

#include <iostream.h>
bla
bla

세 번째 테스트에 따르면 키워드는 #include특히 CPP 프로그램 이 있지만 키워드 는 C 유형 입니다. 이제 확인하면

$ file example.cpp

example.cpp: ASCII C program text

이제 객체 지향의 개념은 C ++에만 해당됩니다. C ++에 특정한 파일을 만들어 보자 .

C ++ 프로그램을 다음과 같이 시작합니다.

Class something
{
}
bla
bla

이제 내가 발행하면

$ file example.cpp

출력은

example.cpp: ASCII C++ program text

이것은 기본적으로 file유사한 파일에서 명령이 작동 하는 방식에 대해 설명 합니다 (이 예제에서 C 프로그램과 C ++ 프로그램은 C ++에 특정한 객체 지향 기능을 사용하지 않는 한 동일하게 취급됩니다).


1

Gilles와 Michael Homer는 훌륭한 답변을 제공했습니다. 내가 당신을 참조하십시오. 시스템에서 인식되는 파일 형식을 보려면 다음을 실행하십시오.

cat /usr/share/magic

권한 문제가 있거나 존재하지 않는 경우 가능할 수 있습니다.

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(시스템에 따라 조정해야 할 수도 있음) 시스템의 파일 유형 목록이 표시됩니다. 루트 파일 시스템의 크기에 따라이 명령을 실행하는 데 시간이 오래 걸릴 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.