Linux / 명령어 / ln - 하드 링크와 심볼릭 링크 생성

ln은 파일 사이에 하드 링크 또는 심볼릭 링크를 만드는 명령입니다. 기본 동작은 하드 링크 생성이고, -s를 사용하면 대상 경로 문자열을 저장하는 심볼릭 링크를 만듭니다.

이 글에서는 두 링크의 구조적 차이, 기본 문법, 상대·절대 심볼릭 링크 선택, 기존 링크 교체와 링크 상태 확인 방법을 설명합니다.

ln 명령어란?

하드 링크는 같은 파일 시스템의 동일한 inode를 가리키는 또 하나의 이름입니다. 심볼릭 링크는 다른 경로를 가리키는 별도 파일이며 파일 시스템 경계를 넘거나 디렉터리를 가리킬 수 있습니다. 원본 이름을 삭제해도 하드 링크가 남으면 데이터는 유지되지만, 심볼릭 링크의 대상 경로가 사라지면 깨진 링크가 됩니다.

기본 문법

ln [옵션] 대상 링크이름
ln [옵션] 대상 ... 디렉터리

파일명이나 경로에 공백이 있으면 따옴표로 감싸고, 하이픈으로 시작하는 이름은 가능한 경우 -- 뒤에 지정합니다. 지원 옵션은 배포판과 GNU Coreutils 버전에 따라 다를 수 있으므로 ln --help와 man ln으로 현재 시스템의 설명을 확인하세요.

ln 기본 사용법

하드 링크 만들기

옵션 없이 대상과 새 이름을 지정합니다. 두 경로는 같은 inode를 가리키며 한쪽 내용을 수정하면 다른 이름에서도 같은 내용이 보입니다.

ln original.txt hard-link.txt
stat -c '%i %h %n' original.txt hard-link.txt

심볼릭 링크 만들기

-s를 사용합니다. 링크에 저장되는 대상 문자열은 실제 존재 여부와 관계없이 만들 수 있습니다.

ln -s /opt/myapp/current app-current
readlink app-current

여러 링크를 디렉터리에 만들기

여러 대상을 지정하고 마지막에 디렉터리를 두거나 -t로 대상 디렉터리를 지정합니다.

ln -s file1 file2 links/
ln -s -t links file1 file2

심볼릭 링크가 가리키는 경로 확인하기

ln -s는 보통 성공 메시지를 출력하지 않습니다. 링크 안에 기록된 대상 문자열은 readlink로 확인합니다.

printf 'demo\n' > original.txt
ln -s original.txt shortcut.txt
readlink shortcut.txt

예시 출력은 original.txt입니다. 상대 경로는 링크가 놓인 디렉터리를 기준으로 해석되므로 링크를 다른 위치로 옮기면 대상이 끊어질 수 있습니다.

주요 옵션

옵션 설명
-s, --symbolic 하드 링크 대신 심볼릭 링크를 만듭니다.
-r, --relative 링크 위치를 기준으로 상대적인 심볼릭 링크를 만듭니다. -s와 함께 사용합니다.
-f, --force 기존 대상 링크 이름을 제거하고 새 링크를 만듭니다.
-i 기존 링크 이름을 교체하기 전에 확인합니다.
-n 대상이 디렉터리를 가리키는 심볼릭 링크일 때 링크 자체로 처리합니다.
-T 링크 이름을 디렉터리가 아니라 정확한 경로로 취급합니다.
-b 교체할 기존 파일의 백업본을 만듭니다.
-v 생성한 링크를 출력합니다.

긴 옵션은 의미를 파악하기 쉽고 스크립트 검토에도 도움이 됩니다. 다만 이식성이 중요한 스크립트에서는 대상 시스템이 해당 GNU 확장 옵션을 지원하는지 먼저 확인하세요.

실전 활용 예제

상대 심볼릭 링크 만들기

같은 디렉터리 트리를 다른 위치로 옮길 수 있어야 한다면 상대 링크가 유용합니다. 상대 경로는 현재 셸 위치가 아니라 링크 파일이 놓일 디렉터리를 기준으로 해석됩니다.

ln -s ../releases/2026-09 app/current
ln -sr /srv/app/releases/2026-09 /srv/app/current

기존 링크 안전하게 교체하기

배포 포인터처럼 링크를 바꿀 때는 기존 경로가 실제 디렉터리인지 심볼릭 링크인지 먼저 확인하세요. -sfnT 조합은 GNU 환경에서 정확한 링크 경로를 교체하는 데 쓰일 수 있지만 대상 검증이 먼저입니다.

readlink current
ln -sfnT releases/2026-10 current
readlink current

링크 종류와 대상 확인하기

ls -l, readlink, stat을 함께 사용하면 링크 문자열과 최종 대상, inode 관계를 확인할 수 있습니다.

ls -l app-current
readlink app-current
readlink -f app-current
stat app-current

ln와 관련 명령 비교

명령·방법 주요 역할 적합한 상황
하드 링크 같은 inode의 또 다른 이름 같은 파일 시스템의 일반 파일
심볼릭 링크 대상 경로 문자열을 저장하는 별도 파일 디렉터리·다른 파일 시스템·배포 포인터
cp 독립된 데이터 복사본 원본과 별개로 변경해야 할 때
바인드 마운트 경로를 다른 위치에 마운트 파일 시스템 수준의 디렉터리 노출이 필요할 때

사용할 때 주의할 점

인수 순서를 기억한다

기본 형식은 ln 대상 링크이름입니다. 자연어의 복사 방향과 혼동하면 의도와 다른 링크가 생길 수 있습니다.

상대 링크의 기준은 링크 위치다

현재 디렉터리에서 보이는 상대 경로를 그대로 넣어도 링크가 다른 디렉터리에 생성되면 깨질 수 있습니다. ln -sr 또는 계산된 상대 경로를 사용하세요.

하드 링크는 파일 시스템 경계를 넘지 못한다

하드 링크는 같은 파일 시스템의 inode를 공유하므로 다른 마운트 지점으로 만들 수 없습니다. 디렉터리 하드 링크도 일반적으로 제한됩니다.

FAQ

ln의 기본값은 심볼릭 링크인가요?

아닙니다. 기본값은 하드 링크이며 심볼릭 링크를 만들려면 -s가 필요합니다.

원본 파일을 삭제하면 하드 링크도 사라지나요?

아닙니다. 같은 inode를 가리키는 다른 하드 링크가 남아 있으면 데이터는 유지됩니다.

심볼릭 링크가 깨졌는지 어떻게 확인하나요?

readlink 링크로 저장된 경로를 보고, readlink -e 또는 test -e로 최종 대상 존재 여부를 확인할 수 있습니다.

절대 링크와 상대 링크 중 무엇이 좋나요?

링크를 포함한 트리를 함께 이동해야 하면 상대 링크가, 링크 위치가 바뀌어도 고정된 시스템 경로를 가리켜야 하면 절대 링크가 적합할 수 있습니다.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux 강좌 / 터미널과 셸 시작하기 - 명령어 구조와 도움말 읽기

Linux 강좌 / 터미널과 셸 시작하기 - 명령어 구조와 도움말 읽기

터미널과 셸의 차이부터 명령어·옵션·인수의 구조, 실행 결과 읽기, Bash 도움말 찾기까지 실습으로 익힙니다.

Linux / 명령어 / truncate - 파일 크기 줄이기와 늘리기

Linux / 명령어 / truncate - 파일 크기 줄이기와 늘리기

Linux truncate 명령어로 파일 크기를 지정하거나 늘리고 줄이는 방법을 설명합니다. 희소 파일, 상대 크기 조정, 기준 파일과 같은 크기로 맞추는 방법 및 데이터 손실 주의점을 알아봅니다.

Linux / 명령어 / unzip - ZIP 파일 목록 확인과 안전한 압축 해제

Linux / 명령어 / unzip - ZIP 파일 목록 확인과 안전한 압축 해제

Linux unzip 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux / 명령어 / xz - 파일을 xz 형식으로 압축하기

Linux / 명령어 / xz - 파일을 xz 형식으로 압축하기

Linux xz 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux / 명령어 / wc - 줄·단어·문자 수 계산

Linux / 명령어 / wc - 줄·단어·문자 수 계산

Linux wc 명령어로 줄·단어·바이트·문자 수를 확인하는 방법을 설명합니다. 개행 기준의 줄 수, -c와 -m 차이, 여러 파일 합계와 안전한 파이프 활용 예제를 정리합니다.

Linux / 명령어 / column - 텍스트를 읽기 좋은 표 형태로 정렬

Linux / 명령어 / column - 텍스트를 읽기 좋은 표 형태로 정렬

Linux column 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환

Linux / 명령어 / dd - 블록 단위 데이터 복사와 변환

Linux dd 명령어로 파일과 블록 장치 데이터를 복사하고 변환하는 방법을 설명합니다. if와 of, 블록 크기, 진행률, 디스크 이미지 생성·복원 및 대상 장치 오지정 위험을 정리합니다.

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux ping 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux join 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux mv 명령어로 파일과 디렉터리를 이동하거나 이름을 변경하는 방법을 설명합니다. 덮어쓰기 방지, 파일 시스템 간 이동과 안전한 자동화 방법도 정리합니다.