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 / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux / 명령어 / locate - 파일 이름 색인에서 빠르게 경로 검색

Linux locate 명령어로 파일 이름 색인을 빠르게 검색하는 방법을 설명합니다. updatedb, 최신성 한계, 패턴과 정규 표현식, find와의 차이를 정리합니다.

Linux / 디스크 관리 / 파티션, 포맷, 마운트

Linux / 디스크 관리 / 파티션, 포맷, 마운트

Linux에서 디스크를 관리할 때 필요한 파티션 생성, 파일 시스템 포맷, 마운트 방법을 정리했습니다.

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

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

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

Linux / 명령어 / head - 파일 앞부분의 줄과 바이트 출력

Linux / 명령어 / head - 파일 앞부분의 줄과 바이트 출력

Linux head 명령어로 파일의 처음 몇 줄이나 바이트를 출력하는 방법을 설명합니다. 여러 파일, 음수 개수, 파이프 활용과 바이너리 데이터 주의점도 정리합니다.

Linux / 명령어 / dirname - 경로에서 디렉터리 부분 추출

Linux / 명령어 / dirname - 경로에서 디렉터리 부분 추출

Linux dirname 명령어로 경로의 디렉터리 부분을 추출하는 방법을 설명합니다. 입력 형태별 결과와 basename, realpath의 차이 및 셸 스크립트 활용법을 정리합니다.

Linux / 명령어 / unxz - xz 압축 파일 풀기

Linux / 명령어 / unxz - xz 압축 파일 풀기

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

Linux / 명령어 / ssh - 암호화된 원격 접속과 명령 실행

Linux / 명령어 / ssh - 암호화된 원격 접속과 명령 실행

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

Linux / 명령어 / passwd - 사용자 비밀번호 변경

Linux / 명령어 / passwd - 사용자 비밀번호 변경

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

Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

Linux 강좌 / 파일 비교하기 - diff와 cmp의 차이와 실습

diff와 cmp로 두 파일의 차이를 확인하고 unified diff를 읽는 법을 익힙니다. 내용이 다른 경우와 명령 실행 오류의 종료 상태도 구별합니다.

Linux / 명령어 / date - 현재 시각 표시와 출력 형식 지정

Linux / 명령어 / date - 현재 시각 표시와 출력 형식 지정

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