Linux / 명령어 / stat - 파일 정보와 메타데이터 확인
stat은 파일이나 디렉터리의 크기, 권한, 소유자, inode, 하드 링크 수, 할당 블록과 여러 타임스탬프를 자세히 보여주는 명령입니다. ls -l보다 많은 메타데이터를 확인할 수 있고, 원하는 필드만 일정한 형식으로 출력해 셸 스크립트에서 사용하기에도 좋습니다.
이 글에서는 GNU Coreutils의 stat을 기준으로 기본 출력 읽는 법, atime·mtime·ctime·Birth의 차이, 심볼릭 링크, 파일 시스템 정보와 --format 활용법을 설명합니다.
stat 명령어란?
stat은 파일 내용이 아니라 파일 시스템이 관리하는 상태 정보, 즉 메타데이터를 조회합니다. 검사할 파일이나 디렉터리를 인수로 지정하면 됩니다.
stat report.txt stat /etc stat /usr/bin/bash
파일을 직접 읽어 내용을 분석하는 file 명령과 목적이 다릅니다. file은 형식을 추정하고, stat은 크기·권한·소유권·시간·inode 같은 파일 시스템 정보를 보여줍니다.
기본 문법과 사용법
stat [옵션] 파일 ...
파일 하나뿐 아니라 여러 경로를 한 번에 지정할 수 있습니다.
stat file1.txt file2.txt stat src tests stat "annual report.pdf"
하이픈으로 시작하는 파일명은 옵션으로 오해되지 않도록 -- 뒤에 지정합니다.
stat -- -sample.txt
GNU stat의 버전과 지원 옵션은 다음 명령으로 확인할 수 있습니다.
stat --version stat --help info '(coreutils) stat invocation'
기본 출력 읽는 법
일반 파일에 stat을 실행하면 다음과 비슷한 정보가 나옵니다. 실제 값과 일부 필드는 파일 시스템과 운영체제에 따라 다릅니다.
File: report.txt Size: 4096 Blocks: 8 IO Block: 4096 regular file Device: 8,1 Inode: 1234567 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user) Access: 2026-09-21 10:15:30.000000000 +0900 Modify: 2026-09-21 10:14:02.000000000 +0900 Change: 2026-09-21 10:14:02.000000000 +0900 Birth: 2026-09-20 19:42:11.000000000 +0900
각 항목은 다음 의미를 가집니다.
| 항목 | 의미 |
|---|---|
File |
조회한 파일이나 디렉터리의 이름입니다. |
Size |
파일의 논리적 크기입니다. 일반적으로 바이트 단위로 표시됩니다. |
Blocks |
파일에 할당된 블록 수입니다. 희소 파일이나 압축 파일 시스템에서는 논리적 크기와 실제 할당량의 차이가 클 수 있습니다. |
IO Block |
효율적인 입출력을 위한 권장 블록 크기 정보입니다. |
Device |
파일이 속한 장치를 식별하는 번호입니다. |
Inode |
해당 파일 시스템 안에서 파일 메타데이터를 식별하는 inode 번호입니다. |
Links |
같은 inode를 가리키는 하드 링크 수입니다. |
Access |
8진수 및 기호 형태의 권한과 파일 유형을 보여줍니다. |
Uid, Gid |
소유 사용자와 그룹의 숫자 ID 및 이름입니다. |
Access, Modify, Change, Birth |
접근, 내용 수정, 상태 변경과 생성 시각에 관한 타임스탬프입니다. |
ls -l과 stat의 차이
| 비교 항목 | ls -l |
stat |
|---|---|---|
| 주요 목적 | 여러 파일을 목록 형태로 빠르게 비교합니다. | 지정한 파일의 상세 메타데이터를 확인합니다. |
| 기본 시간 | 주로 수정 시각을 간략히 표시합니다. | 접근·수정·상태 변경·생성 시각을 구분해 표시합니다. |
| inode와 블록 | 옵션을 추가해야 일부 정보를 볼 수 있습니다. | 기본 출력에서 inode, 링크 수, 할당 블록 등을 보여줍니다. |
| 스크립트 출력 | 사람이 읽는 목록 파싱은 환경에 따라 불안정할 수 있습니다. | --format으로 필요한 필드를 직접 지정할 수 있습니다. |
| 파일 시스템 정보 | 직접 제공하지 않습니다. | -f로 파일이 위치한 파일 시스템 상태를 표시합니다. |
여러 파일의 이름, 크기와 권한을 둘러볼 때는 ls -l이 편하고, 파일 하나의 정확한 필드나 자동화에 사용할 값이 필요하면 stat이 적합합니다.
파일 크기와 할당 블록 이해하기
논리적 크기 확인하기
기본 출력의 Size는 파일이 나타내는 전체 바이트 수입니다. 필요한 값만 출력하려면 %s를 사용합니다.
stat -c '%s' disk.img stat -c '%n: %s bytes' file1 file2
디렉터리의 Size는 그 안에 있는 모든 파일의 합계가 아닙니다. 디렉터리 엔트리를 저장하는 디렉터리 자체의 크기입니다. 하위 내용의 전체 사용량은 du로 확인하세요.
할당된 공간 계산하기
%b는 할당된 블록 수, %B는 그 블록 하나의 바이트 크기를 출력합니다.
stat -c 'size=%s blocks=%b block-size=%B' disk.img
대략적인 할당 바이트 수는 %b × %B로 계산할 수 있습니다. 희소 파일은 논리적 크기보다 실제 할당 공간이 훨씬 작을 수 있고, 파일 시스템 압축이나 공유 블록 같은 기능이 있으면 이 값만으로 물리 저장 장치 사용량을 단정하기 어렵습니다.
권한과 소유자 확인하기
8진수 권한과 기호 권한 출력하기
%a는 8진수 권한, %A는 파일 유형을 포함한 사람이 읽기 쉬운 권한을 출력합니다.
stat -c '%a %A %n' script.sh
출력은 다음과 같은 형태가 될 수 있습니다.
755 -rwxr-xr-x script.sh
소유자와 그룹 출력하기
%U와 %G는 사용자명과 그룹명, %u와 %g는 숫자 UID와 GID를 출력합니다.
stat -c 'owner=%U(%u) group=%G(%g)' report.txt
숫자 ID에 대응하는 이름을 찾을 수 없는 환경에서는 이름 필드가 다르게 표시될 수 있습니다.
inode와 하드 링크 확인하기
inode 번호 출력하기
%i는 파일 시스템 안에서 파일을 식별하는 inode 번호를 출력합니다.
stat -c '%i %n' report.txt
inode 번호는 파일 시스템 경계를 넘어 전역적으로 고유하지 않습니다. 같은 파일인지 비교하려면 장치 정보와 inode를 함께 고려해야 합니다.
하드 링크 수 확인하기
%h는 해당 inode를 가리키는 하드 링크 수입니다.
stat -c 'inode=%i links=%h name=%n' original.txt copy-link.txt
두 경로의 장치와 inode가 같다면 같은 파일 데이터를 가리키는 하드 링크일 수 있습니다. 심볼릭 링크는 별도의 inode를 가지므로 같은 방식으로 판단하지 않습니다.
atime, mtime, ctime과 Birth 차이
타임스탬프 이름이 비슷하지만 기록하는 사건이 다릅니다. 특히 ctime을 생성 시각으로 오해하지 않는 것이 중요합니다.
| 시간 | 의미 | 변경될 수 있는 예 |
|---|---|---|
atime |
파일 데이터에 마지막으로 접근한 시각입니다. | 파일 읽기. 단, 마운트 옵션과 캐시 정책에 따라 매번 갱신되지 않을 수 있습니다. |
mtime |
파일 내용이 마지막으로 수정된 시각입니다. | 파일 데이터 쓰기 또는 내용 길이 변경. |
ctime |
inode 상태 정보가 마지막으로 변경된 시각입니다. | 권한·소유자·링크 수 변경, 이름 변경 등. 생성 시각이 아닙니다. |
Birth |
파일이 생성된 시각입니다. | 지원되는 경우 생성 시 한 번 기록되며 일반적인 상태 변경으로 바뀌지 않습니다. |
사람이 읽는 시간 출력하기
%x, %y, %z, %w는 각각 atime, mtime, ctime과 Birth를 사람이 읽는 형식으로 출력합니다.
stat -c 'atime=%x mtime=%y ctime=%z birth=%w' report.txt
Birth를 지원하지 않거나 값을 얻을 수 없는 파일 시스템에서는 %w가 하이픈으로 표시될 수 있습니다.
Epoch 초 단위로 출력하기
대문자 %X, %Y, %Z, %W는 각 시간을 Unix Epoch 이후 초 단위로 출력합니다.
stat -c 'atime=%X mtime=%Y ctime=%Z birth=%W' report.txt
Birth를 알 수 없을 때 %W는 0을 출력합니다. 정렬이나 숫자 비교에는 Epoch 값이 편리하지만, 파일 시스템과 운영체제가 제공하는 시간 정밀도 차이를 고려해야 합니다.
심볼릭 링크 정보 확인하기
링크 자체의 메타데이터 보기
GNU stat은 기본적으로 심볼릭 링크를 따라가지 않고 링크 자체를 조사합니다.
stat current.log stat -c '%N | inode=%i | type=%F' current.log
%N은 링크의 경우 대상과 함께 인용된 파일명을 보여줄 수 있습니다.
-L로 링크 대상의 메타데이터 보기
-L 또는 --dereference를 사용하면 링크가 가리키는 실제 대상의 상태를 조회합니다.
stat -L current.log stat -L -c '%n | inode=%i | type=%F | size=%s' current.log
깨진 심볼릭 링크는 대상을 조회할 수 없으므로 -L 사용 시 오류가 발생합니다.
원하는 필드만 출력하기
-c와 --format 사용하기
-c 또는 --format은 지정한 형식으로 결과를 출력하고 각 파일마다 줄바꿈을 추가합니다.
stat -c '%n %s %a %U:%G' file1 file2 stat --format='name=%n type=%F inode=%i' report.txt
형식 문자열은 셸이 해석하지 않도록 작은따옴표로 묶는 것이 안전합니다.
--printf로 여러 줄 구성하기
--printf는 백슬래시 이스케이프를 해석하지만 자동 줄바꿈은 추가하지 않습니다. 필요한 위치에 \n을 직접 넣습니다.
stat --printf='name=%n\nsize=%s\nmode=%a\n' report.txt
여러 파일을 처리할 때 파일 사이 구분까지 형식 문자열에 포함해야 합니다.
자주 사용하는 형식 지정자
| 지정자 | 출력 내용 |
|---|---|
%n |
파일명입니다. |
%N |
인용된 파일명이며 심볼릭 링크라면 대상 정보도 포함할 수 있습니다. |
%F |
일반 파일, 디렉터리, 심볼릭 링크 같은 파일 유형입니다. |
%s |
전체 크기(바이트)입니다. |
%b |
할당된 블록 수입니다. |
%B |
%b가 나타내는 블록 하나의 바이트 크기입니다. |
%a |
8진수 권한입니다. |
%A |
파일 유형을 포함한 기호 형태 권한입니다. |
%u, %g |
소유자의 숫자 UID와 GID입니다. |
%U, %G |
소유 사용자명과 그룹명입니다. |
%i |
inode 번호입니다. |
%h |
하드 링크 수입니다. |
%m |
파일이 속한 마운트 지점입니다. |
%x, %X |
마지막 접근 시각을 사람이 읽는 형식 또는 Epoch 초로 표시합니다. |
%y, %Y |
마지막 내용 수정 시각을 사람이 읽는 형식 또는 Epoch 초로 표시합니다. |
%z, %Z |
마지막 상태 변경 시각을 사람이 읽는 형식 또는 Epoch 초로 표시합니다. |
%w, %W |
생성 시각을 사람이 읽는 형식 또는 Epoch 초로 표시하며, 알 수 없으면 하이픈 또는 0입니다. |
%C |
지원되는 환경에서 SELinux 보안 컨텍스트를 표시합니다. |
파일 시스템 정보 확인하기
-f로 파일 시스템 상태 보기
-f 또는 --file-system을 사용하면 파일 자체가 아니라 해당 경로가 위치한 파일 시스템 정보를 출력합니다.
stat -f / stat --file-system /home
파일 시스템 유형, 전체 블록, 사용 가능한 블록, inode 수와 최대 파일명 길이 등을 확인할 수 있습니다.
파일 시스템 형식 지정자 사용하기
-f 모드에서는 파일용 형식 지정자와 의미가 다릅니다. 예를 들어 %T는 사람이 읽는 파일 시스템 유형, %b는 전체 데이터 블록, %a는 일반 사용자가 사용할 수 있는 블록 수를 나타냅니다.
stat -f -c 'type=%T total=%b available=%a block-size=%S' /
사람이 읽는 디스크 사용량을 비교하려면 df -h가 더 편할 수 있고, 자동화에 필요한 파일 시스템 필드만 뽑으려면 stat -f -c가 유용합니다.
원격 파일 시스템과 캐시 정책
지원하는 GNU Coreutils 버전에서는 --cached=MODE로 원격 파일 시스템 속성 조회 시 캐시 사용 방식을 지정할 수 있습니다.
| 모드 | 동작 |
|---|---|
default |
캐시 사용 여부를 파일 시스템 기본 정책에 맡깁니다. |
always |
가능하면 캐시된 속성을 사용합니다. 빠를 수 있지만 최신 상태가 아닐 수 있습니다. |
never |
가능하면 최신 속성과 동기화하려고 시도합니다. 원격 접근 지연이 커질 수 있습니다. |
stat --cached=never /mnt/remote/report.txt
실제 보장 수준은 NFS 같은 원격 파일 시스템과 마운트 설정에 따라 달라집니다. 설치된 버전이 이 옵션을 지원하는지는 stat --help로 확인하세요.
셸 스크립트 활용 예제
파일 크기 기준으로 분기하기
path='archive.tar' size=$(stat -c '%s' -- "$path") || exit 1 if [ "$size" -gt 104857600 ]; then printf '%s\n' '100 MiB보다 큰 파일입니다.' fi
파일이 검사와 사용 사이에 바뀔 수 있는 환경에서는 한 번 확인한 메타데이터가 이후 작업까지 그대로 유지된다고 가정하지 마세요.
수정 시각을 숫자로 비교하기
left_mtime=$(stat -c '%Y' -- file-a) right_mtime=$(stat -c '%Y' -- file-b) if [ "$left_mtime" -gt "$right_mtime" ]; then printf '%s\n' 'file-a가 더 최근에 수정되었습니다.' fi
백업이나 배포 판단을 시간 하나에만 의존하면 시계 차이, 복원된 타임스탬프와 동시 수정 때문에 문제가 생길 수 있습니다. 필요하면 체크섬이나 버전 정보도 함께 사용하세요.
자주 사용하는 stat 명령
| 명령 | 용도 |
|---|---|
stat 파일 |
파일의 전체 메타데이터를 표시합니다. |
stat -L 링크 |
심볼릭 링크가 가리키는 대상의 정보를 표시합니다. |
stat -c '%s' 파일 |
파일 크기를 바이트 단위로 출력합니다. |
stat -c '%a %n' 파일 |
8진수 권한과 파일명을 출력합니다. |
stat -c '%U:%G' 파일 |
소유 사용자와 그룹을 출력합니다. |
stat -c '%i %h %n' 파일 |
inode, 하드 링크 수와 파일명을 출력합니다. |
stat -c '%y' 파일 |
마지막 내용 수정 시각을 출력합니다. |
stat -c '%Y' 파일 |
마지막 내용 수정 시각을 Epoch 초로 출력합니다. |
stat -f 경로 |
해당 경로가 있는 파일 시스템 정보를 표시합니다. |
stat -t 파일 |
필드가 고정된 간결한 한 줄 형식으로 출력합니다. |
사용할 때 주의할 점
ctime은 생성 시각이 아니다
ctime은 change time, 즉 파일 상태 정보가 변경된 시각입니다. creation time의 약자가 아니며 생성 시각은 별도의 Birth 필드로 제공될 수 있습니다.
Birth와 atime은 항상 기대한 값이 아니다
생성 시각은 파일 시스템, 커널과 마운트 방식에 따라 지원되지 않을 수 있습니다. atime도 noatime, relatime 같은 마운트 정책과 캐시 때문에 파일을 읽을 때마다 즉시 갱신되지 않을 수 있습니다.
출력 문장을 직접 파싱하지 않는다
기본 출력은 사람을 위한 형식이며 운영체제, Coreutils 버전과 로캘에 따라 달라질 수 있습니다. 자동화에서는 -c로 필요한 필드만 선택하고, 파일명에 공백이나 줄바꿈 같은 문자가 포함될 가능성도 고려하세요.
FAQ
파일의 8진수 권한만 확인하려면 어떻게 하나요?
stat -c '%a' 파일명을 사용합니다. 파일명도 함께 필요하면 stat -c '%a %n' 파일명을 사용하세요.
mtime과 ctime의 차이는 무엇인가요?
mtime은 파일 내용이 마지막으로 수정된 시각이고, ctime은 권한·소유권·링크 수 같은 inode 상태가 마지막으로 변경된 시각입니다. ctime은 파일 생성 시각이 아닙니다.
Birth가 하이픈으로 표시되는 이유는 무엇인가요?
사용 중인 파일 시스템이나 운영체제가 생성 시각을 제공하지 않거나 stat이 그 값을 얻지 못했기 때문입니다. 이 경우 %w는 하이픈, %W는 0을 출력합니다.
디렉터리의 Size가 내부 파일 전체 크기인가요?
아닙니다. 디렉터리 자체의 메타데이터 저장 크기입니다. 디렉터리 아래 파일이 사용하는 전체 공간을 확인하려면 du -sh 디렉터리를 사용하세요.









