Skip to main content

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 (별개의 파일)

개념

같은 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

개념

경로를 가리키는 특수 파일임. (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 # 링크 대상 확인

🔗 관련 문서


🔗 참고 자료