CS학습4 min read
ls: 디렉터리 내용을 나열하는 가장 기본적인 파일 탐색 명령
ls는 디렉터리에 들어 있는 파일과 하위 디렉터리의 이름을 출력하는 리눅스 명령어다. 옵션을 조합하면 권한, 소유자, 크기, 수정 시각 같은 파일 메타데이터(metadata)까지 확인할 수 있다. 파일 시스템 구조를 파악하고 배포·로그 점검 같은 실무 작업의 출발점으로 쓰인다.
By 송민성
1. 개념
ls는 "list"의 약자로, 지정한 디렉터리(directory)에 포함된 항목의 목록을 표준 출력(stdout)으로 내보내는 명령어다. 인자를 주지 않으면 현재 작업 디렉터리(current working directory)를 대상으로 한다. 파일 경로를 직접 주면 해당 파일 하나의 정보만 출력한다.
shell
ls [옵션] [경로...]2. 왜 사용하는가
- 현재 위치에 어떤 파일이 있는지 확인한다.
- 파일의 권한(permission), 소유자(owner), 크기, 수정 시각을 확인한다.
- 숨김 파일(
.env,.git등)이 있는지 점검한다. - 셸 스크립트에서 파일 존재 여부나 목록을 대략적으로 살펴볼 때 쓴다.
3. 동작 원리
디렉터리는 "파일 이름과 inode 번호의 대응표"를 담고 있는 특별한 파일이다. ls는 다음 순서로 동작한다.
opendir/readdir같은 시스템 콜(system call) 계열 함수로 디렉터리 항목(entry)을 읽는다.- 기본 동작에서는
.으로 시작하는 숨김 항목을 제외한다. - 이름을 정렬한다. 정렬 기준은 로케일(locale) 설정에 영향을 받는다.
-l같은 옵션이 있으면 각 항목에 대해stat계열 시스템 콜로 inode의 메타데이터를 추가로 조회해 출력한다.
-l 출력의 각 열은 다음 의미를 가진다.
text
-rw-r--r-- 1 user staff 1024 Oct 27 10:00 notes.txt
│└┬┘└┬┘└┬┘ │ │ │ │ │ └ 이름
│ │ │ │ │ │ │ │ └ 수정 시각
│ │ │ │ │ │ │ └ 크기(바이트)
│ │ │ │ │ │ └ 그룹
│ │ │ │ │ └ 소유자
│ │ │ │ └ 하드 링크 수
│ │ │ └ other 권한
│ │ └ group 권한
│ └ owner 권한
└ 파일 종류(- 일반 파일, d 디렉터리, l 심볼릭 링크)4. 코드 예제
실습용 디렉터리를 만들고 옵션을 하나씩 확인해 보자.
shell
mkdir -p /tmp/ls-demo/src
cd /tmp/ls-demo
echo "hello" > a.txt
echo "secret" > .env
dd if=/dev/zero of=big.bin bs=1024 count=2048 2>/dev/null
ln -s a.txt link-to-a
ls # 기본 목록 (숨김 파일 제외)
ls -a # 숨김 파일 포함 (., .. 도 표시)
ls -A # 숨김 파일 포함, . 와 .. 는 제외
ls -l # 상세 정보
ls -lh # 크기를 사람이 읽기 쉬운 단위로
ls -lt # 수정 시각 최신순 정렬
ls -ltr # 수정 시각 오래된 순 정렬
ls -lS # 크기 큰 순 정렬
ls -d */ # 디렉터리만 출력
ls -R # 하위 디렉터리까지 재귀(recursive) 출력
ls -1 # 한 줄에 하나씩 출력옵션은 묶어서 쓸 수 있다. 자주 쓰는 조합은 ls -lah이다.
shell
ls -lah /tmp/ls-demo확장자별 필터링은 셸의 글로빙(globbing)이 처리한다. ls가 *.txt를 해석하는 것이 아니라 셸이 먼저 파일 목록으로 확장해 ls에 넘긴다.
shell
ls *.txt
ls -l src/5. 시간 복잡도 또는 성능 특성
- 디렉터리 항목이 n개이면 읽기에 O(n), 이름 정렬에 일반적으로 O(n log n)이 든다.
-l,-S,-t등 메타데이터가 필요한 옵션은 항목마다stat호출이 추가되므로 항목이 많을수록 느려진다.- 항목 수가 수십만 개인 디렉터리에서는 정렬을 끄는
-U(GNU ls) 옵션이 도움이 될 수 있다. 이 옵션은 macOS 기본ls에서는 지원되지 않는다. -R은 하위 트리 전체를 순회하므로 출력량과 실행 시간이 크게 늘 수 있다.
6. 실무 사용 사례
- 배포 후 산출물 확인:
ls -lh dist/로 번들 파일 크기를 점검한다. - 로그 확인:
ls -lt /var/log | head로 최근 변경된 로그 파일을 찾는다. - 권한 문제 진단:
ls -l ~/.ssh에서 개인 키 파일 권한이-rw-------인지 확인한다. - 심볼릭 링크 확인:
ls -l의link -> target표기로 링크 대상을 확인한다. - 디렉터리 자체의 정보 확인:
ls -ld /var/www는 내용이 아니라 디렉터리 자체의 권한과 소유자를 보여 준다.
shell
ls -lt /var/log | head -n 5
ls -ld /tmp7. 주의할 점
- 숨김 파일: 기본
ls는.으로 시작하는 파일을 보여 주지 않는다. 설정 파일이 안 보이면-a를 쓴다. - 스크립트에서 출력 파싱 금지: 공백이나 줄바꿈이 들어간 파일명에서 깨진다. 파일 순회는
for f in *나find를 사용한다. - 구현 차이: GNU
ls(대부분의 리눅스)와 BSDls(macOS)는 일부 옵션이 다르다. 예를 들어--color는 GNU 방식이고 macOS에서는-G를 쓴다. - 글로빙 한계:
ls *.log에 일치하는 파일이 없으면 셸이 패턴을 그대로 넘겨No such file or directory오류가 난다. - 정렬 순서: 로케일에 따라 대소문자나 한글 정렬 순서가 달라질 수 있다.
8. 핵심 정리
ls는 디렉터리 항목을 나열하는 명령이며, 인자가 없으면 현재 디렉터리를 대상으로 한다.-l은 상세 정보,-a는 숨김 파일,-h는 사람이 읽기 쉬운 크기,-t/-S는 정렬,-R은 재귀 출력이다.-l출력의 첫 글자는 파일 종류, 이어지는 9글자는 owner/group/other 권한이다.- 항목 수가 많으면 정렬(O(n log n))과
stat호출 비용이 커진다. - 스크립트에서
ls출력을 파싱하지 말고 글로빙이나find를 사용한다.