infra
Platform

모듈 맵

[Linux] 절대/상대 경로와 리눅스 디렉터리 구조 마스터

0 / 37 완료

펼치기
0 / 37 완료0%

Linux · 03 / 37

[Linux] 절대/상대 경로와 리눅스 디렉터리 구조 마스터

ls, cd, pwd, mkdir, cp, mv, rm으로 Linux 파일시스템을 자유롭게 탐색하고 파일을 다룹니다.

🚨INCIDENT ALERT
HIGH

입사 3일 차. 운영팀에서 급하게 메시지가 왔습니다. "서버에서 Nginx가 502를 뱉고 있어요. 로그 확인해주세요." SSH 접속은 됐습니다. 문제는 — 로그가 어디에 있는지 모른다는 겁니다. /log? /nginx? /var? 이것저것 ls를 쳐보지만 어지러운 파일 목록만 나옵니다. 결국 선임에게 전화했습니다. "거기 /var/log/nginx/ 보세요." 5초 만에 해결됐습니다.

Linux는 어디에 무엇을 두는지 규칙이 있습니다. 이 구조를 알면 낯선 서버에서도 5분 안에 원하는 파일을 찾을 수 있습니다.

파일시스템 탐색

이번 챕터에서 배울 것
  • 1Linux 디렉토리 계층 구조(FHS)를 이해하고 /etc, /var/log, /tmp 같은 실무 경로를 설명할 수 있다
  • 2pwd, cd, ls로 파일시스템을 자유롭게 탐색할 수 있다
  • 3절대 경로와 상대 경로의 차이를 이해하고 상황에 맞게 사용할 수 있다
  • 4mkdir, touch로 파일과 디렉토리를 생성하고 cp, mv로 복사·이동할 수 있다
  • 5rm 명령어를 안전하게 사용하고 실수를 예방하는 패턴을 적용할 수 있다
실습 환경 준비
실습 디렉토리 생성
mkdir -p ~/lab/filesystem && cd ~/lab/filesystem

모든 실습은 이 디렉토리 안에서 진행합니다

실습 파일 준비
touch file1.txt file2.log file3.conf && mkdir -p project/src project/docs

실습에 사용할 기본 파일과 디렉토리 구조를 만듭니다

현재 위치 확인
pwd

/home/<사용자명>/lab/filesystem 이 출력되면 준비 완료

💡개념

Linux 파일시스템 계층 구조 (FHS)

장애가 나면 가장 먼저 로그를 봐야 합니다. 그런데 서버에 처음 들어간 신입이 로그 파일을 찾으려면 어디를 봐야 할까요? Nginx 설정은 어디 있고, 애플리케이션 데이터는 어느 디렉토리에 쌓이는지 — 이걸 모르면 서버 안에서 길을 잃습니다. Linux는 어디에 무엇을 두는지 FHS(Filesystem Hierarchy Standard)라는 규칙으로 정해두었고, 모든 배포판이 이 규칙을 따릅니다. /etc에는 설정, /var/log에는 로그, /home에는 사용자 데이터 — 이 구조를 알면 낯선 서버에 들어가도 5분 안에 원하는 파일을 찾을 수 있습니다.

Linux FHS 디렉토리 계층 구조 — /etc, /var/log, /home 등 실무 경로

Linux의 모든 파일은 / (루트)에서 시작하는 하나의 트리 구조에 위치합니다. Windows의 C:, D:\ 같은 드라이브 구분 없이 단일 계층입니다. Filesystem Hierarchy Standard(FHS)가 어디에 무엇을 두는지 규칙을 정합니다.

로컬 터미널
# 루트 디렉토리 구조 한눈에 보기
ls /
OUTPUT
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

실무에서 자주 가는 경로들입니다.

경로용도실무 예시
/etc설정 파일 모음/etc/nginx/nginx.conf, /etc/ssh/sshd_config
/var/log로그 파일/var/log/nginx/access.log, /var/log/syslog
/var/www웹 서버 문서 루트Nginx, Apache 기본 경로
/home/username사용자 홈 디렉토리~ 로 단축 표기
/tmp임시 파일재부팅 시 자동 삭제, 실습에 활용
/opt외부 소프트웨어/opt/splunk, /opt/datadog-agent
/usr/bin일반 실행 파일ls, grep, git 등의 실제 위치
/proc프로세스/커널 가상 파일시스템/proc/cpuinfo, /proc/meminfo
로컬 터미널
# Nginx 설정 파일 빠르게 찾기
ls /etc/nginx/
OUTPUT
conf.d  nginx.conf  sites-available  sites-enabled
💡개념

절대 경로 vs 상대 경로

절대 경로 vs 상대 경로 — 기준점 차이와 스크립트 주의사항

쉘 스크립트를 처음 작성할 때 흔히 저지르는 실수 중 하나가 상대 경로를 그대로 쓰는 겁니다. 터미널에서 직접 실행할 때는 잘 되다가, cron으로 자동 실행하거나 다른 디렉토리에서 스크립트를 호출하면 갑자기 "파일을 찾을 수 없다"는 오류가 납니다. 실행 위치가 달라지면 상대 경로의 기준점도 달라지기 때문입니다. 언제 절대 경로를 써야 하고 언제 상대 경로가 편한지 — 이 구분을 머릿속에 새겨두면 이런 실수를 예방할 수 있습니다.

절대 경로 (Absolute Path): 루트(/)부터 시작. 현재 위치와 무관하게 항상 같은 파일을 가리킵니다.

로컬 터미널
cd /etc/nginx          # 어디서 실행해도 /etc/nginx 로 이동
cat /etc/hosts         # 호스트 파일 읽기

상대 경로 (Relative Path): 현재 위치(pwd)를 기준으로 합니다.

로컬 터미널
# 현재 위치가 /home/ubuntu 라고 가정
cd lab/filesystem      # /home/ubuntu/lab/filesystem 으로 이동
cd ..                  # 한 단계 위 → /home/ubuntu/lab
cd ../../etc           # 두 단계 위 후 etc → /etc
cd ~                   # 홈 디렉토리로 이동 (어디서든)
cd -                   # 이전 디렉토리로 토글

스크립트나 cron 작업에서는 상대 경로 대신 절대 경로를 사용하세요. 실행 위치가 달라도 항상 같은 파일을 가리킵니다.

💡개념

ls 출력 읽기 & 파일 정보 해석

ls -la 출력 해석 — 파일 타입·권한·소유자·크기 읽기

ls -la를 처음 보면 drwxr-xr-x 2 root root 4096 같은 문자열이 나열되고 무슨 뜻인지 알기 어렵습니다. 하지만 이 한 줄에는 파일 타입, 읽기/쓰기/실행 권한, 소유자, 크기, 수정 시각이 모두 들어 있습니다. Permission denied 오류가 나거나 "왜 이 파일이 실행이 안 되지?" 싶을 때 — 해답이 이 출력 안에 있습니다.

로컬 터미널
ls -la /etc/nginx/
OUTPUT
total 24
drwxr-xr-x  6 root root 4096 Sep 15 10:23 .
drwxr-xr-x 97 root root 4096 Sep 15 10:23 ..
drwxr-xr-x  2 root root 4096 Sep 15 10:23 conf.d
-rw-r--r--  1 root root 1490 Sep 15 10:23 nginx.conf
lrwxrwxrwx  1 root root   34 Sep 15 10:23 sites-enabled -> /etc/nginx/sites-available

첫 글자가 파일 타입입니다: d=디렉토리, -=일반 파일, l=심볼릭 링크. 그 뒤 9자리(rwxr-xr-x)는 소유자/그룹/그 외 순서로 읽기(r=4)·쓰기(w=2)·실행(x=1) 권한입니다.

실무에서 자주 쓰는 ls 조합입니다.

로컬 터미널
ls -lath /var/log/nginx/    # 최신 파일이 맨 위, 사람이 읽기 좋은 용량
ls -lS /var/log/ | head -10 # 가장 큰 파일 순서로 정렬
ls /etc/*.conf              # 특정 확장자만 보기
du -sh /var/log/nginx/      # 디렉토리 전체 용량 요약

1파일시스템 탐색 (pwd, cd, ls)

pwd로 현재 위치를 확인하고 cd로 이동하면서 실무에서 자주 가는 경로를 직접 탐색합니다.

로컬 터미널
# 현재 위치 확인
pwd
OUTPUT
/home/ubuntu/lab/filesystem
로컬 터미널
# /etc 주요 파일 목록 확인
ls -la /etc/ | head -20

# /var/log 로그 디렉토리 확인
ls /var/log/

# 홈 디렉토리로 이동 후 다시 돌아오기
cd ~
pwd
cd -
pwd
로컬 터미널
# 상대 경로 이동 연습
cd /var/log
ls
cd ../../etc    # 두 단계 올라간 뒤 etc 로 이동
pwd
cd ~/lab/filesystem   # 실습 디렉토리로 복귀
OUTPUT
/etc
ls -la /etc/ | head -20
🔍실행 후 확인할 것
  • pwd를 실행하면 /home/<사용자명>/lab/filesystem 처럼 현재 위치 전체 경로가 출력됩니다
  • ls /var/log/ 에서 syslog, auth.log, nginx/ 같은 서비스별 로그 디렉토리가 보입니다
  • cd - 를 실행하면 이전 위치로 즉시 이동하고 해당 경로가 출력됩니다
  • cd ../../etc 처럼 .. 을 연결해서 여러 단계를 한 번에 이동할 수 있습니다
2파일과 디렉토리 생성 (mkdir, touch)

mkdir -p로 중첩 디렉토리를 한 번에 만들고, touch로 빈 파일을 생성합니다.

로컬 터미널
cd ~/lab/filesystem

# 중첩 디렉토리 한 번에 생성 (-p 옵션 없으면 상위 디렉토리가 없어 실패)
mkdir -p app/src/utils
mkdir -p app/logs app/configs

# 구조 확인
ls -R app/
OUTPUT
app/:
configs  logs  src

app/configs:

app/logs:

app/src:
utils
로컬 터미널
# 빈 파일 생성
touch app/configs/app.conf
touch app/logs/app.log app/logs/error.log

# 파일 목록 확인 (타임스탬프 포함)
ls -la app/configs/
ls -la app/logs/
mkdir -p app/src/utils && touch app/configs/app.conf
🔍실행 후 확인할 것
  • mkdir 없이 mkdir -p 를 쓰면 중간 디렉토리가 없어도 한 번에 생성됩니다
  • touch 로 만든 파일은 크기가 0인 빈 파일입니다 (ls -la 에서 0 확인)
  • ls -la 출력에서 수정 시각(날짜·시간)이 현재 시각으로 표시됩니다
  • touch 를 이미 존재하는 파일에 쓰면 내용은 유지되고 수정 시각만 갱신됩니다
3파일 복사와 이동 (cp, mv)

cp는 원본을 남기고 복사하고, mv는 원본을 이동하거나 이름을 바꿉니다. 디렉토리를 복사할 때는 -r 옵션이 필수입니다.

로컬 터미널
cd ~/lab/filesystem

# 파일 복사 (백업 관행: .bak 또는 날짜 suffix)
cp app/configs/app.conf app/configs/app.conf.bak
ls app/configs/
OUTPUT
app.conf  app.conf.bak
로컬 터미널
# 디렉토리 전체 복사 (-r 없으면 오류)
cp -r app/ app-backup/
ls
OUTPUT
app  app-backup
로컬 터미널
# 파일 이름 변경 (같은 디렉토리 내 mv)
mv app/configs/app.conf.bak app/configs/app.conf.20240915

# 파일 이동 (잘라내기+붙여넣기)
mkdir archive
mv app/logs/app.log app/logs/error.log archive/

ls archive/
ls app/logs/
OUTPUT
access.log  error.log

(비어 있음)
cp -r app/ app-backup/
🔍실행 후 확인할 것
  • cp 는 원본이 그대로 남고, mv 는 원본이 사라집니다
  • cp -r 없이 디렉토리를 복사하면 'omitting directory' 오류가 납니다
  • mv 는 같은 파일시스템 안에서 실제로 파일을 옮기지 않고 경로 항목만 바꾸므로 매우 빠릅니다
  • mv source dest 에서 dest 가 디렉토리면 그 안으로 이동, 아니면 이름 변경입니다
4파일 삭제 (rm) — 신중하게

rm은 휴지통 없이 즉시 삭제합니다. -i 옵션으로 삭제 전 확인을 요청하는 습관을 들이세요.

로컬 터미널
cd ~/lab/filesystem

# 파일 하나 삭제
rm app/configs/app.conf.20240915

# 삭제 전 확인 (-i 옵션) — y 입력 시 삭제
rm -i app-backup/configs/app.conf
OUTPUT
rm: remove regular file 'app-backup/configs/app.conf'? y
로컬 터미널
# 디렉토리 전체 삭제 (-r 옵션)
rm -r app-backup/

# 삭제됐는지 확인
ls
OUTPUT
app  archive
로컬 터미널
# 안전한 습관: 삭제 전 echo 로 대상 목록 확인
echo rm -r archive/   # 실제 삭제하지 않고 명령어만 출력
ls archive/           # 무엇이 삭제될지 확인
rm -r archive/        # 확인 후 실행
rm -i app-backup/configs/app.conf
🔍실행 후 확인할 것
  • rm -i 를 실행하면 파일마다 y/n 확인을 요청합니다 — 실수 방지에 효과적입니다
  • rm -r 은 디렉토리와 그 안의 모든 파일을 재귀적으로 삭제합니다
  • 삭제 후 ls 를 실행하면 해당 파일/디렉토리가 목록에서 사라진 것을 확인할 수 있습니다
  • rm 에는 휴지통이 없습니다 — 삭제하면 복구가 어렵습니다
위험 명령어DIR 변수가 빈 문자열이면 rm -rf /* 와 동일하게 동작해 시스템 전체가 삭제될 수 있습니다. 프로덕션 서버에서 실제로 발생한 장애 유형입니다.

경로 변수가 비어있을 때 rm -rf $DIR/* 실행

안전한 실행 조건: 변수에 반드시 값이 있음을 보장한 후 실행. 현재 위치(pwd)를 두 번 확인 후 실행.

실행 전 반드시 확인

  • pwd 로 현재 위치 확인 — 의도한 디렉토리가 맞는지 검증
  • echo rm -rf $DIR/* 로 실제 실행 전 대상 경로 출력 확인
  • 스크립트에서는 : ${DIR:?'DIR is not set'} 구문으로 빈 변수 차단
  • 프로덕션에서 rm -rf 실행 전 ls 로 삭제 대상 목록 먼저 확인
rm -rf $DIR/*

위 항목을 모두 확인한 후 복사할 수 있습니다

상황: 파일을 백업 디렉토리로 복사하려는데 No such file or directory 오류가 납니다. 분명히 파일을 만들었는데 왜 안 될까요?

원인: 두 가지 원인이 많습니다. 첫째, 현재 디렉토리가 파일이 있는 위치가 아닌 경우. 둘째, 파일명 오타 — Linux 파일시스템은 대소문자를 구분하므로 Config.confconfig.conf는 다른 파일입니다.

진단:

로컬 터미널
# 1. 현재 위치 확인
pwd

# 2. 파일이 정말 있는지 확인 (대소문자 무시 검색)
ls | grep -i "source"

# 3. 대상 디렉토리 존재 확인
ls -la /backup/ 2>&1
OUTPUT
ls: cannot access '/backup/': No such file or directory

해결:

로컬 터미널
# 대상 디렉토리가 없으면 먼저 생성
mkdir -p /backup

# 정확한 파일명으로 재실행
cp source.txt /backup/dest.txt

# 디렉토리 복사 시 -r 옵션 누락 오류도 흔합니다
# cp: -r not specified; omitting directory 'mydir'
cp -r mydir/ /backup/
💼
실무 맥락프로덕션 서버에서 Nginx 502 Bad Gateway 에러가 발생했습니다. 원인을 파악하기 위해 로그 파일을 신속하게 찾고 확인해야 합니다.
현업 패턴

다음 모듈에서는 파일 내용을 읽고 검색하는 방법 — cat, less, grep으로 로그 파일을 분석하는 실무 기술을 다룹니다.

지식 확인

퀴즈 — 3문제

Q1

rm -rf /var/log/myapp/ 명령과 rm -rf /var/log/myapp 명령의 실제 동작 차이는?

Q2

cp -r /home/alice/project /backup/ 명령을 실행했을 때 /backup/ 디렉토리가 이미 존재한다면 결과는?

Q3

find 명령 없이 현재 디렉토리의 모든 .log 파일 목록을 확인하는 가장 간단한 방법은?

0 / 3 답변

🧪 실습으로 확인하기

새 서버 인수인계 — 처음 30분

초급

낯선 Linux 서버를 인수받았을 때 OS, 서비스, 로그를 빠르게 파악하는 루틴을 직접 수행한다.

30📋 3단계💻 직접 환경
실습 시작하기 →

이것도 배워보세요

linux입문 · 45
[Linux] 리눅스 다중 사용자 권한 분리와 그룹 설정 실무
Linux 트랙 계속
docker입문 · 30
[Docker] 백엔드 개발자에게 Docker와 컨테이너 가상화가 필수인 이유
Docker 트랙 시작점