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

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

임의의 파일에 포함된 데이터 유형을 식별해야 합니다. 저는 리눅스를 처음 접했습니다.

나는 이 file명령을 사용하여 파일의 데이터 유형을 알 계획입니다. 나는 명령을 시도했고 아래의 결과를 얻었습니다.

누군가 나에게 이 file명령이 데이터 유형을 결정하기 위해 파일의 초기 바이트를 살펴보라고 제안했습니다. 이 file명령은 파일 확장자를 전혀 확인하지 않습니다. 그렇죠? 나는 보았다매뉴얼 페이지하지만 너무 기술적이라고 느꼈어요. 누군가 명령이 어떻게 작동하는지에 대한 간단한 설명이 포함된 링크를 제공할 수 있다면 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 명령 다음에 파일을 입력할 때 얻을 수 있는 출력)을 제공하는 데이터베이스가 있습니다. 그렇죠? "file" 명령 출력에 "text"라는 단어가 포함될 때마다 이는 실제로 텍스트 뷰어를 사용하여 읽을 수 있는 항목을 참조하는 반면, "text"가 없는 항목은 일종의 이진 파일입니까?

답변1

file 여러 테스트 사용:

1: 만약문서존재하지 않거나 읽을 수 없거나 파일 상태를 확인할 수 없는 경우 출력에는 파일이 처리되었지만 해당 유형을 확인할 수 없다고 표시되어야 합니다.

그러면 cannot open file: No such file or directory.

2: 파일이 일반 파일이 아닌 경우 해당 파일 유형을 식별해야 합니다. 파일 유형 디렉터리, FIFO, 소켓, 특수 블록 및 특수 문자는 이와 같이 식별되어야 합니다. 다른 구현 정의 파일 유형도 인식됩니다. 파일이 심볼릭 링크인 경우 링크는 기본적으로 확인되어야 하며 파일은 심볼릭 링크에서 참조하는 파일 형식을 테스트해야 합니다. ( 아래 -h-i옵션을 참조하세요.)

.: directory그러면 및 와 같은 내용이 출력됩니다 /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/pdfPDF document. 이는 항상 기계가 아닌 사람이 이해할 수 있는 방식으로 파일 형식에 대한 상위 수준 설명입니다.

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

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

foo: data이는 단순히 파일에 대한 정보를 파악할 수 없는 경우 입니다 .

다른 작은 레이블도 나타날 수 있습니다. 실행 파일( ) 파일에는 출력에 " "가 포함되며 +x일반적으로 쉼표로 구분됩니다. 또한 executable구현 file에서는 ' '와 같은 파일 형식에 대한 다른 사항을 설명할 수 있도록 특정 파일 형식에 대한 추가 정보를 알 수도 있습니다 PDF document, version 1.4.

답변2

매뉴얼 페이지는 일반적으로 소개보다는 간결한 참조 자료입니다. ~에서위키피디아 페이지.

file파일 이름이 아닌 파일 내용만 봅니다. (또한 파일 형식(디렉토리, 심볼릭 링크, 명명된 파이프 등)과 같은 일부 파일 메타데이터도 살펴봅니다. 하지만 관심 있는 경우에는 콘텐츠가 중요합니다.)

file파일 형식은 일반적으로 처음 몇 바이트를 보고 내장 테이블과 비교하여 추측합니다.매직넘버. 예를 들어 파일이 로 시작하는 경우 "PDF 문서" %PDFfile보고합니다(그리고 더 자세히 조사하여 가장 낮은 버전을 보고합니다). 여기에는 처음 몇 바이트가 인쇄 가능한 ASCII 범위 내에 있는 경우 "ASCII 텍스트"를 보고하는 등 매직 넘버로 시작하지 않는 파일 형식에 대한 경험적 방법이 포함되어 있습니다.

의 출력은 file취약합니다. UNIX 변형과 버전에 따라 다를 수 있습니다. Linux, Cygwin 및 *BSD에서 이 명령은 다음 형식으로 예측 가능한 출력을 생성하는 file옵션을 지원합니다 .-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-typeMIME 유형 자체만 필요하고 인코딩 정보가 없는 경우에 사용하십시오 application/pdf. 예를 들어 -b파일 이름을 줄 시작 부분에 표시하지 않으려면 이 옵션을 전달하십시오.

답변3

나는 당신이 대답을 읽어주기를 바랍니다여기. 답변의 일부 발췌 내용은 다음과 같습니다.

명령의 매뉴얼 페이지에서 file,

file이 명령은 실제로 파일 형식을 결정하기 위해 3가지 테스트를 수행합니다.

첫 번째 테스트

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

두 번째 테스트

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

세 번째 테스트

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

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

이제 C++ 프로그램이 이렇게 시작하고 세 번째 테스트가 성공했다고 가정해 보겠습니다.

#include <iostream>
bla
bla

세 번째 테스트에 따르면 키워드는 #include해당 유형을 구체적으로 지정합니다.프로그램이 있지만소비자 보호 계획프로그램을 보유하고 있습니다. 이제 확인해 보면,

$ 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++ 프로그램은 동일한 것으로 간주됩니다).

답변4

Giles와 Michael Homer는 훌륭한 답변을 제공했습니다. 참고하시길 추천드립니다. 시스템에서 인식되는 파일 형식을 보려면 다음을 실행해 보세요.

cat /usr/share/magic

이로 인해 권한 문제가 발생하거나 존재하지 않는다면 아마도

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

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

관련 정보