Linux / 명령어 / file - 파일 종류와 형식 확인
file은 파일 확장자만 보지 않고 파일 시스템 정보, 내용의 고유한 바이트 패턴과 텍스트 특성을 검사하여 파일 형식을 추정하는 명령입니다. 이름이 잘못됐거나 확장자가 없는 파일도 실제 형식, 실행 파일 종류, 문자 인코딩과 MIME 유형을 확인할 수 있습니다.
이 글에서는 기본 사용법부터 MIME 출력, 심볼릭 링크와 압축 파일 처리, 여러 파일 검사, 셸 스크립트 활용과 결과 해석 시 주의점을 설명합니다.
file 명령어란?
file은 인수로 받은 각 경로를 검사해 사람이 읽기 쉬운 파일 유형 설명을 출력합니다.
file README.md file photo.jpg file /usr/bin/ls
결과는 시스템, file 버전과 magic 데이터베이스에 따라 조금씩 달라질 수 있습니다. 일반적인 출력 형태는 다음과 같습니다.
README.md: Unicode text, UTF-8 text photo.jpg: JPEG image data, JFIF standard 1.01 /usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked
file은 내용을 바꾸지 않고 읽어서 분류합니다. 다만 파일에 접근할 권한이 필요하며, 검사 방식에 따라 접근 시간이 갱신될 수 있습니다.
file이 파일 형식을 판별하는 원리
일반적인 file 구현은 다음 검사를 순서대로 수행하며, 먼저 성공한 검사 결과를 기본 설명으로 사용합니다.
- 파일 시스템 검사: 디렉터리, 심볼릭 링크, 소켓, FIFO, 빈 파일과 같은 유형을 메타데이터로 확인합니다.
- magic 검사: 파일의 특정 위치에 있는 고유한 바이트 패턴을 magic 데이터베이스와 비교합니다.
- 텍스트와 언어 검사: 문자 인코딩과 내용의 특징을 살펴 텍스트 형식이나 작성 언어를 추정합니다.
PNG, JPEG, PDF와 ELF 실행 파일처럼 형식에 고정된 식별 정보가 있는 파일은 확장자가 없어도 분류할 수 있습니다. 반면 고유 패턴이 없거나 내용이 너무 짧고 모호하면 단순히 data로 표시될 수 있습니다.
기본 문법과 사용법
file [옵션] 파일 ...
파일 하나뿐 아니라 여러 경로를 한 번에 검사할 수 있습니다.
file report.pdf file image.png archive.tar.gz script.sh file /etc /dev/null /usr/bin/env
공백이나 셸 특수 문자가 있는 경로는 따옴표로 묶고, 하이픈으로 시작하는 파일명 앞에는 옵션 종료 표시 --를 사용합니다.
file "annual report.pdf" file -- -sample.bin
설치된 버전과 지원 옵션은 다음 명령으로 확인할 수 있습니다.
file --version file --help man file
확장자와 실제 파일 형식 비교하기
확장자가 없어도 형식 확인하기
Linux 실행 파일이나 명령 스크립트에는 확장자가 없는 경우가 많습니다. file은 이름 대신 내용을 검사하므로 형식을 확인할 수 있습니다.
file /usr/bin/bash file /usr/bin/python3 file ./run-backup
스크립트에 셔뱅(shebang)이 있으면 인터프리터 정보가 결과에 포함될 수 있고, 컴파일된 프로그램은 ELF 형식과 아키텍처, 동적 링크 여부 등이 표시될 수 있습니다.
확장자가 잘못된 파일 확인하기
다운로드하거나 전달받은 파일의 확장자가 실제 내용과 맞지 않을 때도 유용합니다.
file download.dat file attachment.bin
결과가 이미지나 압축 형식을 가리키더라도 이름을 자동으로 바꾸지는 않습니다. 필요한 프로그램과 업무 규칙을 확인한 뒤 확장자를 정하세요.
자주 나오는 결과 해석하기
| 대표 표현 | 의미 |
|---|---|
directory |
일반 파일이 아니라 디렉터리입니다. |
symbolic link to ... |
다른 경로를 가리키는 심볼릭 링크입니다. |
empty |
크기가 0바이트인 빈 일반 파일입니다. |
ASCII text |
주로 ASCII 범위의 인쇄 가능한 문자로 구성된 텍스트입니다. |
Unicode text, UTF-8 |
UTF-8로 인코딩된 유니코드 텍스트로 판별되었습니다. |
ELF ... executable |
Linux 등에서 사용하는 ELF 형식의 실행 파일입니다. |
shared object |
공유 라이브러리 또는 위치 독립 실행 형식으로 판별될 수 있습니다. |
data |
알려진 형식이나 텍스트로 충분히 식별하지 못한 바이너리 데이터입니다. |
cannot open |
경로가 없거나 권한 등으로 파일을 열지 못했습니다. |
결과는 파일의 신뢰성이나 안전성을 보증하지 않습니다. 특정 형식으로 인식됐다는 사실과 악성 코드가 없다는 판단은 서로 다른 문제입니다.
MIME 유형과 문자 인코딩 확인하기
-i로 MIME 유형과 인코딩 함께 보기
-i 또는 --mime은 사람이 읽는 긴 설명 대신 MIME 유형과 문자 인코딩을 출력합니다.
file -i index.html file --mime README.md
텍스트 파일은 다음처럼 MIME 유형과 charset이 함께 표시될 수 있습니다.
index.html: text/html; charset=utf-8
유형 또는 인코딩만 출력하기
--mime-type은 MIME 유형만, --mime-encoding은 인코딩 정보만 표시합니다.
file --mime-type image.webp file --mime-encoding README.md
파일명 없이 값만 필요하면 -b를 함께 사용합니다.
file -b --mime-type image.webp file -b --mime-encoding README.md
웹 서버 설정이나 업로드 검사에서 참고할 수 있지만, 클라이언트가 보낸 MIME 값이나 file 결과 하나만으로 파일을 안전하다고 판단해서는 안 됩니다.
출력에서 파일명과 정렬 간격 조정하기
-b로 설명만 출력하기
기본 출력은 파일명: 설명 형식입니다. -b 또는 --brief는 파일명 접두어를 생략합니다.
file -b archive.tar.gz file -b --mime-type photo.jpg
스크립트 변수에 결과만 저장할 때 유용합니다.
-N과 -F로 여러 파일 출력 다듬기
여러 파일을 검사하면 파일명이 같은 폭으로 맞춰질 수 있습니다. -N은 이 여백을 제거하고, -F는 파일명과 결과 사이의 구분자를 바꿉니다.
file -N file1 file-with-long-name.bin file -F ' => ' file1 file2
파일명에 구분자나 줄바꿈이 포함될 수 있는 자동화에서는 사람이 읽는 출력 형식을 직접 파싱하기보다 NUL 구분 옵션과 안전한 파일 목록 처리를 검토하세요.
심볼릭 링크 검사하기
링크 자체 확인하기
일반적인 기본 동작에서는 심볼릭 링크를 따라가지 않고 링크 자체와 대상을 표시합니다. 이 동작을 명시하려면 -h 또는 --no-dereference를 사용합니다.
file -h current.log
환경 변수 POSIXLY_CORRECT 설정에 따라 기본 동작이 달라질 수 있으므로 스크립트에서는 필요한 옵션을 명시하는 편이 안전합니다.
-L로 링크 대상 확인하기
-L 또는 --dereference는 심볼릭 링크를 따라가 실제 대상 파일의 형식을 검사합니다.
file -L current.log file --dereference latest-image
깨진 링크는 대상 파일을 열 수 없으므로 링크 또는 오류에 관한 결과가 표시됩니다.
압축 파일과 내부 데이터 검사하기
기본 상태에서 압축 형식 확인하기
옵션 없이 검사하면 일반적으로 gzip, xz, bzip2와 같은 바깥쪽 압축 형식을 설명합니다.
file backup.tar.gz file archive.xz
-z로 압축을 풀어 내부 형식 살펴보기
-z 또는 --uncompress는 지원하는 압축 형식의 데이터를 풀어 내부 내용도 검사합니다.
file -z backup.tar.gz file --uncompress archive.xz
압축 해제 과정에는 추가 시간과 자원이 필요합니다. 출처를 신뢰할 수 없는 대용량 파일이나 압축 폭탄 가능성이 있는 파일은 격리된 환경과 별도의 제한 정책으로 다뤄야 합니다.
여러 파일과 파일 목록 검사하기
셸 glob으로 여러 파일 지정하기
현재 디렉터리의 특정 확장자 파일을 한 번에 검사할 수 있습니다.
file *.jpg file *.sh
glob과 일치하는 파일이 없을 때 셸 설정에 따라 패턴 문자열이 그대로 전달될 수 있습니다. 파일명이 매우 많으면 명령행 길이 한도를 넘을 수도 있습니다.
-f로 파일명 목록 읽기
-f 또는 --files-from은 한 줄에 하나씩 적힌 경로 목록을 읽어 검사합니다.
file -f files-to-check.txt file -F ' => ' -f files-to-check.txt
-f는 해당 옵션을 만나는 즉시 목록을 처리하므로, -F처럼 출력에 영향을 주는 옵션은 앞에 배치해야 합니다.
표준 입력과 find 결과 검사하기
표준 입력의 데이터 형식 확인하기
파일명으로 하이픈 하나 -를 지정하면 표준 입력에서 데이터를 읽습니다.
printf '%s\n' 'hello' | file -
표준 입력은 다시 읽기 어려울 수 있으므로 실제 파일을 검사할 때와 결과의 상세도가 다를 수 있습니다.
find -exec로 재귀 검사하기
하위 디렉터리까지 일반 파일을 재귀적으로 검사하려면 find와 결합할 수 있습니다.
find ./uploads -type f -exec file -- {} +
{} +는 찾은 경로를 가능한 범위에서 묶어 file에 전달하며, 공백이 있는 파일명도 안전하게 처리합니다. 검사 대상이 많으면 경로와 깊이를 제한하세요.
셸 스크립트에서 MIME 유형 활용하기
파일명 없이 MIME 유형만 받아 조건을 분기할 수 있습니다.
path='upload.bin'
mime_type=$(file -b --mime-type -- "$path")
case "$mime_type" in
image/jpeg|image/png|image/webp)
printf '%s\n' '지원하는 이미지 형식입니다.'
;;
*)
printf '%s\n' "지원하지 않는 형식: $mime_type" >&2
exit 1
;;
esac
이 검사는 빠른 분류에 유용하지만 보안 검증을 대신하지 않습니다. 실제 업로드 처리에서는 파일 크기 제한, 안전한 디코더, 저장 경로 분리, 실행 권한 제거와 필요에 따른 악성 코드 검사를 함께 적용해야 합니다.
주요 옵션 정리
| 옵션 | 설명 |
|---|---|
-b, --brief |
출력에서 파일명 접두어를 생략합니다. |
-i, --mime |
MIME 유형과 문자 인코딩을 출력합니다. |
--mime-type |
MIME 유형만 출력합니다. |
--mime-encoding |
문자 인코딩 정보만 출력합니다. |
-L, --dereference |
심볼릭 링크를 따라가 대상 파일을 검사합니다. |
-h, --no-dereference |
심볼릭 링크를 따라가지 않고 링크 자체를 확인합니다. |
-z, --uncompress |
지원하는 압축 파일을 풀어 내부 형식도 검사합니다. |
-k, --keep-going |
첫 번째 일치 뒤에도 다른 magic 일치를 계속 검사합니다. |
-f 파일 |
지정한 파일에서 검사할 경로 목록을 읽습니다. |
-F 문자열 |
파일명과 결과 사이의 구분자를 바꿉니다. |
-N, --no-pad |
여러 결과의 파일명 정렬을 위한 여백을 제거합니다. |
-p, --preserve-date |
지원하는 시스템에서 검사 전의 파일 접근 시간을 보존하려고 시도합니다. |
-s, --special-files |
블록·문자 장치 같은 특수 파일도 읽어 검사합니다. 장치 접근 위험을 이해할 때만 사용합니다. |
-E |
파일 시스템 오류를 일반 결과로 계속 처리하지 않고 오류 메시지와 실패 상태로 종료하게 합니다. |
-- |
옵션 처리를 끝내 하이픈으로 시작하는 파일명을 안전하게 전달합니다. |
file 결과를 사용할 때 주의할 점
판별 결과는 추정값이다
file은 알려진 패턴과 휴리스틱을 바탕으로 분류합니다. 손상된 파일, 새롭거나 희귀한 형식, 여러 형식이 결합된 파일은 모호하거나 예상과 다른 결과가 나올 수 있습니다.
파일 형식과 안전성은 다르다
이미지나 문서로 식별됐더라도 내부에 악의적인 데이터가 없다는 뜻은 아닙니다. 보안 경계에서는 확장자, MIME 유형과 magic 판별을 함께 참고하되 전용 파서와 정책 기반 검증을 사용해야 합니다.
특수 파일과 대용량 입력을 조심한다
-s로 장치 파일을 읽거나 -z로 압축 데이터를 검사하면 일반 파일 검사보다 위험과 비용이 커질 수 있습니다. 대상의 출처와 크기를 확인하고 최소 권한으로 실행하세요.
FAQ
file 명령어는 파일 확장자를 확인하나요?
주요 판별은 파일 시스템 정보와 내용의 magic 패턴, 문자 인코딩 및 텍스트 특성을 이용합니다. 따라서 확장자가 없거나 잘못돼도 실제 내용에 근거한 형식을 추정할 수 있습니다.
MIME 유형만 파일명 없이 출력하려면 어떻게 하나요?
file -b --mime-type 파일명을 사용합니다. -b가 파일명 접두어를 생략하고 --mime-type이 MIME 유형만 선택합니다.
심볼릭 링크 대상의 파일 형식을 확인하려면 어떻게 하나요?
file -L 링크명을 사용합니다. 링크 자체의 정보를 확인하려면 file -h 링크명을 사용하세요.
file 결과가 data로만 나오는 이유는 무엇인가요?
magic 데이터베이스와 일치하는 알려진 패턴이 없고 텍스트로도 판별되지 않았기 때문일 수 있습니다. 파일이 손상됐거나 너무 짧거나, 설치된 magic 데이터베이스가 해당 형식을 모를 수도 있습니다.









