File Copy & Links
cp, 하드 링크, 심볼릭 링크 차이점과 inode 개념
🎯 개요
| 방식 | 명령어 | 특징 |
|---|---|---|
| 복사 | cp | 새로운 파일 생성 (별개의 데이터) |
| 하드 링크 | ln | 같은 데이터를 가리킴 (inode 공유) |
| 심볼릭 링크 | ln -s | 경로를 가리킴 (바로가기) |
📦 inode 개념
inode란?
inode (Index Node): 파일의 메타데이터를 저장하는 자료구조임.
파일 구조
핵심 포인트:
- 파일명은 디렉토리에 저장됨
- inode는 파일명을 모름 (숫자로만 관리)
- 하나의 inode에 여러 파일명 연결 가능 → 하드 링크
inode 확인
# inode 번호 확인
ls -i myfile.txt
# 12345 myfile.txt
# 상세 정보
stat myfile.txt
# File: myfile.txt
# Size: 1024 Blocks: 8 IO Block: 4096 regular file
# Device: 801h/2049d Inode: 12345 Links: 1
# Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
# Access: 2026-01-27 10:00:00
# Modify: 2026-01-27 09:00:00
# Change: 2026-01-27 09:00:00
📋 cp (파일 복사)
기본 사용법
# 파일 복사
cp source.txt dest.txt
# 디렉토리 복사 (-r)
cp -r ./srcdir ./destdir
# 속성 보존 (-p)
cp -p source.txt dest.txt
# 아카이브 모드 (-a = -dR --preserve=all)
cp -a ./srcdir ./destdir
주요 옵션
| 옵션 | 설명 |
|---|---|
-r, -R | 디렉토리 재귀 복사 |
-p | 권한, 소유자, 타임스탬프 보존 |
-a | 아카이브 모드 (모든 속성 보존, 링크 유지) |
-i | 덮어쓰기 전 확인 |
-n | 덮어쓰기 안 함 |
-u | 소스가 더 새로울 때만 복사 |
-v | 상세 출력 |
-l | 복사 대신 하드 링크 생성 |
-s | 복사 대신 심볼릭 링크 생성 |
복사 후 상태
# 원본
echo "hello" > original.txt
ls -i original.txt
# 12345 original.txt
# 복사
cp original.txt copied.txt
ls -i copied.txt
# 67890 copied.txt ← 다른 inode (별개의 파일)
🔗 하드 링크 (Hard Link)
개념
같은 inode를 가리키는 또 다른 이름임.
# 하드 링크 생성
ln original.txt hardlink.txt
특징
# inode 확인 - 같은 번호!
ls -i original.txt hardlink.txt
# 12345 original.txt
# 12345 hardlink.txt
# 링크 카운트 확인
stat original.txt | grep Links
# Links: 2
# 원본 수정 → 하드링크에도 반영
echo "modified" >> original.txt
cat hardlink.txt
# hello
# modified
# 원본 삭제 → 하드링크는 여전히 접근 가능
rm original.txt
cat hardlink.txt # 정상 동작!
하드 링크 특징 요약
| 특징 | 설명 |
|---|---|
| 같은 inode | 원본과 동일한 데이터 참조 |
| 원본 삭제해도 유지 | 링크 카운트가 0이 될 때까지 데이터 유지 |
| 디렉토리 불가 | 파일만 가능 (루프 방지) |
| 같은 파일시스템만 | 다른 파티션/디스크 불가 |
| 용량 차지 안 함 | 디렉토리 엔트리만 추가 |
제한 사항
# 디렉토리 하드링크 불가
ln ./mydir ./hardlink_dir
# ln: ./mydir: hard link not allowed for directory
# 다른 파일시스템 불가
ln /home/user/file.txt /mnt/external/link.txt
# ln: failed to create hard link: Invalid cross-device link
🔗 심볼릭 링크 (Symbolic Link)
개념
경로를 가리키는 특수 파일임. (Windows 바로가기와 유사)
# 심볼릭 링크 생성
ln -s original.txt symlink.txt
# 또는 절대경로
ln -s /home/user/original.txt symlink.txt
특징
# inode 확인 - 다른 번호!
ls -i original.txt symlink.txt
# 12345 original.txt
# 99999 symlink.txt ← 별도의 inode
# ls -l로 확인
ls -l symlink.txt
# lrwxrwxrwx 1 user user 12 Jan 27 10:00 symlink.txt -> original.txt
# 원본 삭제 → 심볼릭 링크 깨짐 (Dangling Link)
rm original.txt
cat symlink.txt
# cat: symlink.txt: No such file or directory
ls -l symlink.txt
# lrwxrwxrwx 1 user user 12 Jan 27 10:00 symlink.txt -> original.txt (빨간색)
심볼릭 링크 특징 요약
| 특징 | 설명 |
|---|---|
| 경로 참조 | 파일 경로를 저장 |
| 원본 삭제 시 깨짐 | Dangling Link 발생 |
| 디렉토리 가능 | 디렉토리 링크 가능 |
| 다른 파일시스템 가능 | 파티션/디스크 넘어서 가능 |
| 별도 inode | 자체 inode 가짐 |
상대경로 vs 절대경로
# 상대경로 (링크 위치 기준)
ln -s ../data/file.txt link.txt
# 절대경로
ln -s /home/user/data/file.txt link.txt
권장: 이동 가능성 있으면 상대경로, 고정된 위치면 절대경로 사용.
🆚 비교 요약
복사 vs 하드링크 vs 심볼릭링크
| 항목 | cp (복사) | 하드 링크 | 심볼릭 링크 |
|---|---|---|---|
| inode | 새로 생성 | 공유 | 새로 생성 |
| 디스크 사용 | 데이터 복제 | 거의 없음 | 거의 없음 |
| 원본 삭제 시 | 영향 없음 | 접근 가능 | 깨짐 |
| 디렉토리 | 가능 (-r) | 불가 | 가능 |
| 파일시스템 간 | 가능 | 불가 | 가능 |
| 원본 수정 반영 | 안 됨 | 즉시 반영 | 즉시 반영 |
도식화
🎯 언제 뭘 쓰나
| 상황 | 권장 방식 |
|---|---|
| 독립적인 복사본 필요 | cp |
| 같은 파일에 여러 이름 | 하드 링크 |
| 원본 삭제해도 접근 필요 | 하드 링크 |
| 디렉토리 링크 | 심볼릭 링크 |
| 다른 파일시스템 참조 | 심볼릭 링크 |
| 바로가기/단축 경로 | 심볼릭 링크 |
| 설정 파일 버전 관리 | 심볼릭 링크 |
실전 예시
# 1. 설정 파일 심볼릭 링크 (dotfiles 관리)
ln -s ~/dotfiles/.bashrc ~/.bashrc
ln -s ~/dotfiles/.vimrc ~/.vimrc
# 2. 현재 버전 디렉토리 링크
ln -s /opt/app-v2.1.0 /opt/app-current
# 3. 백업에서 하드링크 (rsync --link-dest)
# 변경 안 된 파일은 이전 백업과 하드링크로 용량 절약
# 4. 빌드 결과물 심볼릭 링크
ln -s /var/www/releases/20260127 /var/www/current
🔍 링크 관리 명령어
# 심볼릭 링크 찾기
find /path -type l
# 깨진 심볼릭 링크 찾기
find /path -xtype l
# 하드 링크 찾기 (같은 inode)
find /path -samefile original.txt
# 링크 대상 확인
readlink symlink.txt
readlink -f symlink.txt # 최종 경로까지 추적
# 심볼릭 링크 수정 (삭제 후 재생성)
rm symlink.txt
ln -s new_target.txt symlink.txt
# 또는 -f 옵션
ln -sf new_target.txt symlink.txt
📋 명령어 요약
# 복사
cp source dest # 파일 복사
cp -r srcdir destdir # 디렉토리 복사
cp -a srcdir destdir # 속성 보존 복사
# 하드 링크
ln source hardlink # 하드 링크 생성
ls -i file # inode 확인
# 심볼릭 링크
ln -s target symlink # 심볼릭 링크 생성
ln -sf target symlink # 기존 링크 덮어쓰기
readlink symlink # 링크 대상 확인
🔗 관련 문서
- Linux Filesystem Overview - 파일시스템 종류와 특징
- File Transfer & Sync Tools - rsync, scp, rclone