리눅스 `stat` 명령어는 `ls` 명령보다 훨씬 더 상세한 정보를 제공합니다. 이 유용하고 사용자 정의 가능한 도구를 사용해 파일 시스템의 내부를 자세히 살펴보세요. 사용법을 안내해 드리겠습니다.
`stat`, 무대 뒤의 이야기
`ls` 명령어는 강력하고 많은 작업을 수행하지만, 리눅스에서는 항상 더 깊이 파고들어 표면 아래에 숨겨진 것을 볼 수 있는 방법이 있습니다. 때로는 단순한 겉핥기가 아니라 바닥판을 뜯고 그 아래를 탐구하는 수준까지 나아가야 할 때도 있습니다. 리눅스는 마치 양파 껍질처럼 한 겹씩 벗겨낼 수 있습니다.
`ls`는 파일의 권한, 크기, 파일 종류(일반 파일인지, 심볼릭 링크인지 등)와 같은 많은 정보를 보여줍니다. 이 정보는 `ls`가 아이노드라는 파일 시스템 구조에서 읽어와 표시합니다.
모든 파일과 디렉토리에는 아이노드가 존재합니다. 아이노드는 파일 메타데이터, 파일이 사용하는 파일 시스템 블록, 파일과 관련된 날짜 스탬프 등을 저장합니다. 아이노드는 파일의 도서관 카드와 같다고 할 수 있습니다. 하지만 `ls`는 이 정보의 일부만 보여줍니다. 모든 정보를 확인하려면 `stat` 명령어를 사용해야 합니다.
`ls`처럼 `stat` 명령어에도 다양한 옵션이 있습니다. 따라서 별칭을 사용하는 것이 좋습니다. 원하는 출력을 생성하는 특정 옵션 세트를 찾았다면, 이를 별칭이나 쉘 함수로 만들어 사용하면 편리합니다. 복잡한 명령줄 옵션을 외울 필요 없이 훨씬 간편하게 사용할 수 있습니다.
간단한 비교
`ls`를 사용하여 파일 크기를 사람이 읽기 쉬운 형식으로 표시하고(-h 옵션), 자세한 목록(-l 옵션)을 만들어 보겠습니다.
ls -lh ana.h
왼쪽에서 오른쪽으로 `ls`가 제공하는 정보는 다음과 같습니다.
첫 번째 문자는 하이픈(“-“)으로, 이는 일반 파일임을 의미합니다. 소켓, 심볼릭 링크 등의 다른 유형의 객체가 아니라는 것입니다.
소유자, 그룹, 기타 사용자의 권한이 8진수 형식으로 나열됩니다.
해당 파일을 가리키는 하드 링크의 수입니다. 대부분의 경우 1입니다.
파일 소유자는 `dave`입니다.
그룹 소유자도 `dave`입니다.
파일 크기는 802바이트입니다.
파일은 2015년 12월 13일 금요일에 마지막으로 수정되었습니다.
파일명은 `ana.c`입니다.
이번에는 `stat`을 사용해 보겠습니다.
stat ana.h
다음은 `stat`에서 얻을 수 있는 정보입니다.
파일: 파일 이름입니다. 일반적으로 명령줄에서 `stat`에 전달한 이름과 같지만, 심볼릭 링크의 경우 다를 수 있습니다.
크기: 파일 크기(바이트 단위).
블록: 하드 드라이브에 파일을 저장하는 데 필요한 파일 시스템 블록 수입니다.
IO 블록: 파일 시스템 블록의 크기입니다.
파일 유형: 메타데이터가 설명하는 객체 유형입니다. 가장 일반적인 유형은 파일과 디렉토리이지만 링크, 소켓 또는 명명된 파이프일 수도 있습니다.
장치: 16진수 및 10진수로 표현된 장치 번호입니다. 이는 파일이 저장된 하드 드라이브의 ID입니다.
아이노드: 아이노드 번호입니다. 즉, 해당 아이노드의 ID 번호입니다. 아이노드 번호와 장치 번호는 파일을 고유하게 식별합니다.
링크: 해당 파일을 가리키는 하드 링크 수를 나타냅니다. 각 하드 링크는 고유한 아이노드를 가지고 있습니다. 따라서 이 숫자는 해당 파일을 가리키는 아이노드 수라고 생각할 수도 있습니다. 하드 링크가 생성되거나 삭제될 때마다 이 숫자는 증감합니다. 0이 되면 파일 자체가 삭제되고 아이노드가 제거됩니다. 디렉토리에 `stat`을 사용하면 이 숫자는 현재 디렉토리(“.”)와 상위 디렉토리(“..”)를 포함한 디렉토리 내 파일 수를 나타냅니다.
액세스: 파일 권한은 8진수 및 rwx 형식(읽기, 쓰기, 실행)으로 표시됩니다.
Uid: 소유자의 사용자 ID와 계정 이름입니다.
Gid: 소유자의 그룹 ID와 계정 이름입니다.
액세스: 파일 접근 타임스탬프입니다. 보이는 것처럼 간단하지 않습니다. 최신 리눅스 배포판은 접근 시간 업데이트에 필요한 하드 드라이브 쓰기를 최적화하는 `relatime`이라는 체계를 사용합니다. 간단히 말해, 접근 시간이 수정 시간보다 오래된 경우에만 업데이트됩니다.
수정: 파일 수정 타임스탬프입니다. 파일 내용이 마지막으로 수정된 시간입니다. (운이 좋게도, 이 파일의 내용은 4년 전 오늘 변경되었습니다.)
변경: 파일 변경 타임스탬프입니다. 파일의 속성 또는 내용이 마지막으로 변경된 시간입니다. 새 파일 권한을 설정하여 파일을 수정하면 변경 타임스탬프는 업데이트되지만(파일 속성이 변경되었으므로), 수정 타임스탬프는 업데이트되지 않습니다(파일 내용이 변경되지 않았으므로).
Birth: 파일의 원래 생성 날짜를 표시하기 위해 예약되어 있지만, 리눅스에서는 구현되지 않습니다.
타임스탬프 이해하기
타임스탬프는 시간대에 민감합니다. 각 줄 끝에 있는 “-0500″은 해당 파일이 협정 세계시(UTC)보다 5시간 빠른 시간대에서 생성되었음을 나타냅니다. 따라서 이 컴퓨터는 해당 파일을 생성한 컴퓨터보다 5시간 느립니다. 사실, 이 파일은 영국 시간대의 컴퓨터에서 생성되었으며, 우리는 미국 동부 표준 시간대의 컴퓨터에서 파일을 보고 있습니다.
수정 및 변경 타임스탬프는 이름이 유사하여 처음 보는 사람에게는 혼란스러울 수 있습니다.
이제 `chmod`를 사용하여 `ana.c` 파일의 권한을 수정해 보겠습니다. 모든 사용자가 쓸 수 있도록 변경하겠습니다. 이는 파일 내용에는 영향을 미치지 않지만 파일 속성에는 영향을 미칩니다.
chmod +w ana.c
그런 다음 `stat`을 사용하여 타임스탬프를 확인합니다.
stat ana.c
변경 타임스탬프는 업데이트되었지만, 수정 타임스탬프는 업데이트되지 않았습니다.
수정된 타임스탬프는 파일 내용이 변경된 경우에만 업데이트됩니다. 변경 타임스탬프는 콘텐츠 변경 및 속성 변경 모두에 대해 업데이트됩니다.
여러 파일에 `stat` 사용하기
여러 파일에 대한 `stat` 보고서를 한 번에 보려면, 명령줄에서 파일 이름을 `stat`에 전달합니다.
stat ana.h ana.o
파일 집합에 `stat`을 사용하려면 패턴 매칭을 사용하세요. 물음표(“?”)는 단일 문자를 나타내고, 별표(“*”)는 임의의 문자열을 나타냅니다. 다음 명령을 사용하여 단일 문자 확장자를 가진 “ana”로 시작하는 파일에 대해 보고하도록 `stat`에 지시할 수 있습니다.
stat ana.?
`stat`을 사용하여 파일 시스템 보고하기
`stat`은 파일 시스템의 상태와 파일의 상태를 모두 보고할 수 있습니다. `-f`(파일 시스템) 옵션은 `stat`에게 해당 파일이 위치한 파일 시스템에 대한 정보를 보고하도록 지시합니다. 파일 이름 대신, `/`와 같은 디렉토리를 `stat`에 전달할 수도 있습니다.
stat -f ana.c
다음은 통계 정보에서 얻을 수 있는 정보입니다.
파일: 파일 이름입니다.
ID: 16진수 표기법의 파일 시스템 ID입니다.
Namelen: 파일 이름에 허용되는 최대 길이입니다.
유형: 파일 시스템 유형입니다.
블록 크기: 최적의 데이터 전송 속도를 위해 읽기 요청을 요청하는 데이터의 양입니다.
기본 블록 크기: 각 파일 시스템 블록의 크기입니다.
블록:
총계: 파일 시스템에 있는 모든 블록의 총 개수입니다.
여유: 파일 시스템의 여유 블록 수입니다.
사용 가능: 일반(루트가 아닌) 사용자가 사용할 수 있는 사용 가능한 블록 수입니다.
아이노드:
총계: 파일 시스템의 총 아이노드 수입니다.
여유: 파일 시스템에 있는 여유 아이노드 수입니다.
심볼릭 링크 역참조
실제로 심볼릭 링크인 파일에 `stat`을 사용하면, 링크 자체에 대한 정보가 출력됩니다. 링크가 가리키는 파일에 대한 정보를 `stat`으로 얻으려면 `-L`(역참조) 옵션을 사용해야 합니다. `code.c` 파일은 `ana.c`에 대한 심볼릭 링크입니다. 먼저 `-L` 옵션 없이 살펴보겠습니다.
stat code.c
파일 이름은 `code.c -> ana.c`를 가리킨다는 것을 보여줍니다. 파일 크기는 11바이트에 불과합니다. 이 링크를 저장하는 데 사용되는 블록은 없습니다. 파일 형식은 심볼릭 링크로 표시됩니다.
여기서는 실제 파일을 보고 있지 않습니다. 이번에는 `-L` 옵션을 추가하여 살펴보겠습니다.
stat -L code.c
이제 심볼릭 링크가 가리키는 파일에 대한 세부 정보가 표시됩니다. 그러나 파일 이름은 여전히 `code.c`로 되어 있습니다. 이는 대상 파일 이름이 아니라 링크 이름입니다. 이는 명령줄에서 `stat`에 전달한 이름이기 때문입니다.
간결한 보고서
`-t`(간소) 옵션을 사용하면 `stat`이 요약된 보고서를 제공합니다.
stat -t ana.c
명확한 단서가 없습니다. 이를 이해하려면 출력 필드 순서를 암기할 때까지 이 출력을 전체 통계 출력과 대조해야 합니다.
사용자 정의 출력 형식
`stat`에서 다른 데이터 세트를 얻는 더 좋은 방법은 사용자 정의 형식을 사용하는 것입니다. “형식 시퀀스”라고 하는 긴 토큰 목록이 있습니다. 각 토큰은 데이터 요소를 나타냅니다. 출력에 포함할 요소를 선택하고 형식 문자열을 만듭니다. `stat`을 호출하고 형식 문자열을 전달하면, 출력에 요청한 데이터 요소만 포함됩니다.
파일 및 파일 시스템에 대한 다양한 형식 시퀀스 세트가 있습니다. 파일 형식 시퀀스는 다음과 같습니다.
%a: 8진수 액세스 권한입니다.
%A: 사람이 읽을 수 있는 형식(rwx)의 액세스 권한입니다.
%b: 할당된 블록 수입니다.
%B: 각 블록의 크기(바이트)입니다.
%d: 10진수로 된 장치 번호입니다.
%D: 16진수로 된 장치 번호입니다.
%f: 16진수로 된 원시 모드입니다.
%F: 파일 형식입니다.
%g: 소유자의 그룹 ID입니다.
%G: 소유자의 그룹 이름입니다.
%h: 하드 링크 수입니다.
%i: 아이노드 번호입니다.
%m: 마운트 지점입니다.
%n: 파일 이름입니다.
%N: 인용된 파일 이름, 심볼릭 링크인 경우 역참조된 파일 이름입니다.
%o: 최적의 I/O 전송 크기 힌트입니다.
%s: 총 크기(바이트)입니다.
%t: 문자/블록 장치 특수 파일에 대한 주요 장치 유형(16진수)입니다.
%T: 문자/블록 장치 특수 파일에 대한 보조 장치 유형(16진수)입니다.
%u: 소유자의 사용자 ID입니다.
%U: 소유자의 사용자 이름입니다.
%w: 파일 생성 시간, 사람이 읽을 수 있는 시간 또는 알 수 없는 경우 하이픈(“-“)입니다.
%W: 파일 생성 시간, 에포크 이후 초 단위, 알 수 없는 경우 0입니다.
%x: 사람이 읽을 수 있는 마지막 접근 시간입니다.
%X: 마지막 접근 시간(에포크 이후 초)입니다.
%y: 사람이 읽을 수 있는 마지막 데이터 수정 시간입니다.
%Y: 마지막 데이터 수정 시간(에포크 이후 초)입니다.
%z: 사람이 읽을 수 있는 마지막 상태 변경 시간입니다.
%Z: 마지막 상태 변경 시간(에포크 이후 초)입니다.
“에포크”는 유닉스 에포크, 즉 1970-01-01 00:00:00 +0000(UTC)를 의미합니다.
파일 시스템의 경우 형식 시퀀스는 다음과 같습니다.
%a: 일반(루트가 아닌) 사용자가 사용할 수 있는 사용 가능한 블록 수입니다.
%b: 파일 시스템의 총 데이터 블록입니다.
%c: 파일 시스템의 총 아이노드 수입니다.
%d: 파일 시스템에 있는 사용 가능한 아이노드 수입니다.
%f: 파일 시스템에서 사용 가능한 블록 수입니다.
%i: 16진수 표기법의 파일 시스템 ID입니다.
%l: 파일 이름의 최대 길이입니다.
%n: 파일 이름입니다.
%s: 블록 크기(최적 쓰기 크기)입니다.
%S: 파일 시스템 블록의 크기(블록 수)입니다.
%t: 16진수로 된 파일 시스템 유형입니다.
%T: 사람이 읽을 수 있는 형식의 파일 시스템 유형입니다.
형식 시퀀스 문자열을 사용할 수 있는 두 가지 옵션이 있습니다. `–format` 및 `–printf`입니다. 둘의 차이점은 `–printf`가 C 스타일 이스케이프 시퀀스를 해석한다는 것입니다. 예를 들어, 줄바꿈 `\n` 및 탭 `\t`와 같이 출력에 줄바꿈 문자를 자동으로 추가하지 않습니다.
이제 형식 문자열을 만들어 `stat`에 전달해 보겠습니다. 사용할 형식 시퀀스는 파일 이름에 `%n`, 파일 크기에 `%s`, 파일 유형에 `%F`입니다. 각 파일이 새 줄에서 처리되도록 문자열 끝에 `\n` 이스케이프 시퀀스를 추가하겠습니다. 형식 문자열은 다음과 같습니다.
"File %n is %s bytes, and is a %F\n"
`–printf` 옵션을 사용하여 이 문자열을 `stat`에 전달합니다. `code.c` 파일과 `ana.?` 패턴과 일치하는 파일 세트에 대해 보고하도록 `stat`에 요청할 것입니다. 다음은 전체 명령입니다. `–printf`와 형식 문자열 사이의 등호 “=”에 유의하세요.
stat --printf="File %n is %s bytes, and is a %F\n" code.c ana/ana.?
각 파일에 대한 보고서가 요청한 대로 새 줄에 나열됩니다. 파일 이름, 파일 크기 및 파일 유형이 표시됩니다.
사용자 정의 형식을 사용하면 표준 `stat` 출력에 포함된 것보다 훨씬 많은 데이터 요소에 액세스할 수 있습니다.
세밀한 제어
보시다시피 관심 있는 특정 데이터 요소를 추출할 수 있는 방법이 다양합니다. 복잡하고 긴 명령에 별칭을 사용하도록 권장한 이유를 알 수 있습니다.