파일 형식 확인하기

LinuxBeginner
지금 연습하기

소개

Windows 나 macOS 에서는 파일 확장자를 보고 파일의 종류를 판단하는 데 익숙합니다. 파일 이름이 .jpg로 끝나면 그림 파일이고, .exe로 끝나면 프로그램이라고 생각합니다.

하지만 Linux 에서 파일 이름은 단순한 표시일 뿐입니다. 현실의 라벨과 마찬가지로 잘못 표시될 수도 있습니다. 소금이 든 병에 "설탕"이라고 써 붙여도 내용물의 맛은 여전히 짭니다.

Linux 는 라벨, 즉 파일 이름을 그대로 믿지 않습니다. 대신 파일의 내용을 검사해 실제 형식을 확인합니다.

이는 Unix 의 더 넓은 개념과도 연결됩니다. 데이터의 의미는 이름만이 아니라 데이터가 어떻게 구성되고 사용되는지에서 나오는 경우가 많습니다. 파일 확장자는 사람이 편리하게 참고할 수 있는 정보지만, 최종적인 판단 기준은 아닙니다.

이 실습에서는 파일 이름과 관계없이 파일의 실제 형식을 확인하기 위해 file 명령을 사용합니다.

이 기술은 실제 운영 업무에서 중요합니다. 이름이 잘못 지정된 다운로드 파일, 로그, 덤프, 스크립트 또는 의심스러운 첨부 파일을 만날 수 있기 때문입니다. 파일을 열거나 실행하거나 편집하기 전에 실제 형식을 확인하는 것이 안전합니다.

텍스트 파일 확인하기

먼저 파일 이름이 나타내는 형식과 실제 형식이 일치하는 파일을 확인합니다.

먼저 프로젝트 디렉터리로 이동합니다.

cd ~/project
ls -l

출력에 welcome.txt가 표시됩니다. .txt 확장자는 이 파일이 텍스트 파일임을 나타내는 것처럼 보입니다. 하지만 라벨을 그대로 믿지 않는다는 점을 기억합니다.

file 명령으로 파일을 검사합니다.

file welcome.txt

다음과 비슷한 출력이 표시됩니다.

welcome.txt: ASCII text

file 명령이 파일 내용을 확인하고 다음과 같이 판단한 것입니다. "이 파일은 ASCII 텍스트입니다."

파일이 텍스트인지 미리 알고 있으면 cat, less 같은 명령과 텍스트 편집기를 더 안전하게 사용할 수 있습니다. file 명령은 이러한 판단을 내리는 데 도움을 줍니다.

이 파일은 텍스트이므로 안전하게 읽을 수 있습니다. 다음과 같이 cat 명령을 실행합니다.

cat welcome.txt

바이너리 파일 확인하기

ls, mkdir, cat 같은 시스템 프로그램은 텍스트 파일이 아닙니다. 이러한 파일은 컴퓨터 프로세서만 이해할 수 있는 언어로 작성된 바이너리 파일입니다.

이번에는 ls 명령 자체를 확인합니다. ls 명령은 /bin 디렉터리에 있습니다.

file 명령으로 형식을 확인합니다.

file /bin/ls

출력이 다소 복잡해 보여도 유용한 정보를 담고 있습니다.

/bin/ls: ELF 64-bit LSB pie executable, x86-64, ...

걱정하지 않아도 됩니다. 출력의 의미는 다음과 같습니다.

  • ELF: Linux 프로그램의 표준 형식입니다 (Windows 의 .exe와 비슷합니다).
  • executable: 실행할 수 있는 프로그램입니다.

ELF 는 Executable and Linkable Format의 약자입니다. 많은 Linux 시스템에서 사용하는 표준 바이너리 형식입니다. 전체 이름을 외울 필요는 없지만, ELF 를 보면 "Linux 실행 파일"이라고 이해할 수 있어야 합니다.

핵심은 file 명령이 이 파일을 **실행 파일 (executable)**이라고 알려 주었다는 점입니다. /bin/ls에 cat을 실행하면 화면에 이상한 기호가 가득 표시됩니다. 파일이 바이너리라는 사실을 알면 다음과 같이 판단할 수 있습니다. "이 파일은 읽지 말고 실행해야 합니다."

알 수 없는 파일 식별하기

이제 탐정처럼 파일을 조사합니다. 프로젝트 디렉터리에 의심스러운 파일 두 개가 있습니다. mystery_file과 fake_image.jpg입니다.

사례 1: 이름 없는 파일

mystery_file에는 확장자가 없습니다. 텍스트 파일일까요? 프로그램일까요?

다음 명령으로 확인합니다.

file mystery_file

결과는 다음과 같습니다.

mystery_file: PNG image data, ...

확인 결과 이 파일은 PNG 이미지입니다. 파일 이름에 확장자가 없어도 Linux 는 파일 내부에 있는 PNG 이미지의 시그니처를 확인해 형식을 식별했습니다.

사례 2: 거짓말하는 파일

이번에는 fake_image.jpg를 확인합니다. 확장자는 "JPEG 이미지"라고 말하는 것처럼 보입니다. 실제로도 그럴까요?

file fake_image.jpg

결과는 다음과 같습니다.

fake_image.jpg: ASCII text

확장자가 잘못된 것입니다. 실제로는 텍스트 파일일 뿐입니다.

이 파일이 텍스트라는 것을 확인했으므로 안전하게 읽을 수 있습니다.

cat fake_image.jpg

이처럼 파일 이름이 아니라 파일 내용을 기준으로 파일을 식별하는 기술이 초보자와 숙련된 Linux 사용자를 구분하는 중요한 능력입니다.

이는 Linux 가 일부 데스크톱 운영 체제보다 확장자에 덜 의존하는 이유 중 하나이기도 합니다. 확장자는 유용한 관례이지만, Linux 는 파일 자체를 검사해 더 많은 정보를 확인할 수 있습니다.

요약

파일의 라벨을 그대로 믿지 않고 파일의 실제 형식을 확인하는 방법을 배웠습니다.

  • file filename: 파일의 실제 형식을 확인하는 명령입니다.
  • 확장자는 잘못될 수 있습니다: .jpg라고 해서 항상 이미지 파일인 것은 아닙니다.
  • 확장자가 없어도 문제없습니다: Linux 는 파일 형식을 확인하는 데 확장자가 필요하지 않습니다.

이제 어디서든 마주칠 수 있는 알 수 없는 파일을 확인할 수 있습니다!