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 디렉터리를 사용하세요.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / reboot - 시스템 안전하게 재시작

Linux / 명령어 / reboot - 시스템 안전하게 재시작

Linux reboot 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / cat - 파일 내용 출력과 결합

Linux / 명령어 / cat - 파일 내용 출력과 결합

Linux cat 명령어로 텍스트 파일을 출력하고 여러 파일을 이어 붙이는 방법을 설명합니다. 줄 번호 표시, 빈 줄 압축, 리디렉션과 큰 파일 처리 시 주의점도 정리합니다.

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

Linux 강좌 / 파일과 명령 찾기 - find, locate, which, whereis

find와 locate로 파일을 찾고 which, whereis, type으로 명령의 위치와 해석 방식을 확인합니다. 실시간 검색과 색인 검색의 차이도 짚습니다.

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux sudo 명령어로 허용된 명령을 root 또는 다른 사용자 권한으로 실행하는 방법을 설명합니다. 주요 옵션, 인증 캐시, 리디렉션 문제, visudo와 최소 권한 sudoers 설정 원칙을 정리합니다.

Linux / 명령어 / ssh - 암호화된 원격 접속과 명령 실행

Linux / 명령어 / ssh - 암호화된 원격 접속과 명령 실행

Linux ssh 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / df - 파일 시스템의 남은 용량 확인

Linux / 명령어 / df - 파일 시스템의 남은 용량 확인

Linux df 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux ssh-keygen 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / umask - 새 파일·디렉터리 기본 권한 제한

Linux / 명령어 / umask - 새 파일·디렉터리 기본 권한 제한

Linux umask 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / pacman - Arch Linux에서 패키지 설치와 전체 시스템 업데이트

Linux / 명령어 / pacman - Arch Linux에서 패키지 설치와 전체 시스템 업데이트

Linux pacman 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux 강좌 / 셸의 명령 실행 방식 - ;, &&, ||, 별칭과 환경 변수

Linux 강좌 / 셸의 명령 실행 방식 - ;, &&, ||, 별칭과 환경 변수

Bash가 명령을 해석하고 종료 상태에 따라 다음 명령을 실행하는 방식을 알아봅니다. ;, &&, ||와 별칭·환경 변수의 차이를 안전한 예제로 설명합니다.