Linux / 명령어 / readlink - 심볼릭 링크 대상 경로 확인

readlink는 심볼릭 링크 파일에 저장된 대상 경로를 출력하는 명령입니다. 링크가 상대 경로를 담고 있는지, 깨진 링크가 어느 위치를 가리키는지 확인할 때 유용합니다.

GNU readlink는 -f, -e, -m으로 경로 정규화도 지원하지만, GNU Coreutils는 일반적인 경로 정규화에는 기능과 이름이 더 명확한 realpath 사용을 권장합니다.

readlink 명령어란?

심볼릭 링크를 인수로 지정하면 링크 안에 저장된 대상 문자열을 출력합니다.

readlink current

current 링크가 releases/2026-09를 가리킨다면 다음처럼 출력됩니다.

releases/2026-09

이 값은 링크가 있는 위치를 기준으로 해석되는 상대 경로일 수 있습니다. 기본 readlink는 대상 문자열을 절대 경로로 바꾸지 않고 저장된 형태에 가깝게 보여줍니다.

기본 문법과 사용법

readlink [옵션] 파일 ...

먼저 ln -s로 예제 링크를 만든 뒤 확인할 수 있습니다.

ln -s releases/2026-09 current
readlink current

일반 파일이나 디렉터리를 옵션 없이 지정하면 링크 대상 값이 없으므로 출력하지 않고 0이 아닌 종료 상태로 실패합니다.

readlink /etc/passwd
printf '%s\n' "$?"

상대 링크와 절대 링크 이해하기

상대 경로를 저장한 링크

상대 링크의 대상은 현재 터미널 위치가 아니라 링크가 놓인 디렉터리를 기준으로 해석됩니다.

ln -s ../shared/config.yml /srv/app/config.yml
readlink /srv/app/config.yml

출력은 ../shared/config.yml입니다. 이 경로는 /srv/app을 기준으로 해석되어 /srv/shared/config.yml을 가리킵니다.

절대 경로를 저장한 링크

ln -s /srv/releases/2026-09 /srv/current
readlink /srv/current

절대 링크는 다음처럼 루트에서 시작하는 대상 문자열을 출력합니다.

/srv/releases/2026-09

절대 링크는 위치가 명확하지만 파일 트리를 다른 경로로 이동하면 깨지기 쉽습니다. 배포 구조와 이동 가능성을 고려해 상대 링크와 절대 링크를 선택하세요.

깨진 심볼릭 링크 확인하기

대상 파일이 없어도 심볼릭 링크 자체가 남아 있다면 기본 readlink는 저장된 대상 문자열을 읽을 수 있습니다.

ln -s missing-target broken-link
readlink broken-link
missing-target

링크 대상의 존재 여부는 다음처럼 별도로 검사할 수 있습니다.

if [ -L broken-link ] && [ ! -e broken-link ]; then
  printf '%s\n' '깨진 심볼릭 링크입니다.'
fi

-L은 링크 자체의 존재를, -e는 링크를 따라간 대상의 존재를 검사합니다. 권한 문제나 링크 순환도 결과에 영향을 줄 수 있습니다.

경로 정규화 옵션

GNU readlink는 링크 대상 문자열 출력 외에 경로를 정규화하는 모드도 제공합니다.

옵션 동작
-f, --canonicalize 마지막 구성 요소를 제외한 경로가 존재해야 하며 심볼릭 링크와 점 구성 요소를 해석합니다.
-e, --canonicalize-existing 마지막 항목을 포함한 모든 구성 요소가 존재해야 합니다.
-m, --canonicalize-missing 없는 구성 요소도 디렉터리라고 가정하여 경로를 정규화합니다.

-f로 정규화된 경로 출력하기

readlink -f /srv/current/config.yml

심볼릭 링크와 ., ..을 처리한 절대 경로가 출력됩니다. 마지막 항목은 없어도 허용될 수 있지만 그 앞의 구성 요소는 존재해야 합니다.

-e로 모든 구성 요소의 존재 요구하기

readlink -e /srv/current/config.yml

대상 파일을 포함한 전체 경로가 존재해야 결과를 출력합니다. 존재 여부 확인 후 실제 사용 전 대상이 바뀌는 경쟁 상태까지 방지하지는 않습니다.

-m으로 없는 경로도 정규화하기

readlink -m /srv/future/../uploads/new-file.txt

존재하지 않는 중간 구성 요소도 처리하므로 경로 계획이나 문자열 정리에 사용할 수 있습니다. 출력된 위치가 실제로 생성 가능하다는 보장은 없습니다.

여러 링크와 출력 구분 처리

여러 심볼릭 링크 확인하기

GNU readlink는 여러 링크를 한 번에 받을 수 있습니다.

readlink current previous config-link

각 대상 문자열이 줄 단위로 출력됩니다. 입력과 출력의 대응 관계가 중요하면 반복문에서 링크 이름과 결과를 함께 표시하는 편이 명확합니다.

for link in current previous config-link; do
  target=$(readlink -- "$link") || continue
  printf '%s -> %s\n' "$link" "$target"
done

-n과 -z의 차이

-n 또는 --no-newline은 링크 하나를 처리할 때 출력 끝의 구분 문자를 생략합니다. 여러 파일과 함께 사용하면 경고가 발생할 수 있습니다.

readlink -n current

-z 또는 --zero는 각 결과 끝에 줄바꿈 대신 NUL 문자를 출력합니다. 파일명과 링크 대상에 줄바꿈이 포함될 수 있는 자동화에서는 -z가 더 명확합니다.

readlink -z current previous

readlink, realpath, ls와 stat 비교

명령 주요 목적 특징
readlink 링크에 저장된 대상 문자열 확인 깨진 링크도 링크 자체를 읽을 수 있음
realpath 파일명 정규화와 상대 경로 계산 경로 정규화에는 GNU가 우선 사용을 권장
ls -l 목록에서 링크와 대상을 사람이 읽기 쉽게 확인 다른 목록 정보와 함께 표시되어 파싱에는 부적합
stat 링크 또는 대상의 상세 메타데이터 확인 inode, 권한, 시간과 파일 유형 확인 가능

자동화에서 링크의 대상 문자열만 필요하면 readlink가 적합합니다. 일반적인 경로 정규화와 상대 경로 변환이 목적이라면 realpath가 더 명확합니다.

셸 스크립트에서 활용하기

링크 대상이 상대 경로인지 확인하기

target=$(readlink -- "$link") || {
  printf '%s\n' '심볼릭 링크를 읽을 수 없습니다.' >&2
  exit 1
}

case "$target" in
  /*) printf '%s\n' '절대 경로 링크입니다.' ;;
  *)  printf '%s\n' '상대 경로 링크입니다.' ;;
esac

상대 경로를 실제 위치로 계산하려면 링크가 있는 디렉터리를 기준으로 해야 합니다. 현재 작업 디렉터리에 단순히 붙이면 잘못된 경로가 될 수 있습니다.

종료 상태 확인하기

출력이 비어 있는지만 검사하기보다 명령의 성공 여부를 확인하세요. 링크 대상이 빈 문자열일 수는 없지만 오류 처리 의도를 더 명확하게 표현할 수 있습니다.

if target=$(readlink -- "$link"); then
  printf '%s\n' "$target"
else
  printf '링크를 읽지 못했습니다: %s\n' "$link" >&2
fi

주요 옵션 정리

옵션 설명
-f, --canonicalize 마지막 항목을 제외한 구성 요소가 존재하는 경로를 정규화합니다.
-e, --canonicalize-existing 모든 경로 구성 요소가 존재해야 성공합니다.
-m, --canonicalize-missing 없는 구성 요소도 디렉터리처럼 처리합니다.
-n, --no-newline 단일 결과 뒤의 출력 구분 문자를 생략합니다.
-z, --zero 각 결과를 NUL 문자로 끝냅니다.
-q, -s, --quiet 대부분의 오류 메시지를 억제합니다.
-v, --verbose 오류 메시지를 표시합니다.

자주 발생하는 문제

아무 출력 없이 실패함

기본 모드에서 지정한 경로가 심볼릭 링크가 아니거나 링크 자체에 접근할 수 없을 수 있습니다. 종료 상태를 확인하고 필요하면 -v로 오류 메시지를 표시하세요.

상대 링크 대상이 엉뚱한 곳으로 보임

출력된 상대 경로는 링크가 놓인 디렉터리를 기준으로 해석해야 합니다. 명령을 실행한 현재 디렉터리가 기준이 아닙니다.

readlink -f가 다른 시스템에서 동작하지 않음

-f를 비롯한 정규화 옵션은 구현 차이가 있습니다. 이식성이 필요한 스크립트에서는 대상 운영체제의 지원 여부를 확인하고, 경로 정규화가 목적이면 사용 가능한 realpath 구현과 옵션도 비교하세요.

FAQ

readlink는 심볼릭 링크가 가리키는 파일 내용을 읽나요?

아닙니다. 기본 모드에서는 링크 파일에 저장된 대상 경로 문자열을 출력합니다. 대상 파일의 내용은 읽지 않습니다.

깨진 심볼릭 링크도 readlink로 확인할 수 있나요?

링크 자체가 존재하고 읽을 수 있다면 기본 readlink로 저장된 대상 문자열을 확인할 수 있습니다. -e 정규화는 실제 대상까지 존재해야 성공합니다.

상대 경로가 출력되는데 절대 경로를 확인하려면 어떻게 하나요?

GNU 환경에서는 readlink -f 링크를 사용할 수 있지만, 일반적인 경로 정규화에는 realpath를 사용하는 편이 기능과 의도가 더 명확합니다.

ls -l 대신 readlink를 사용하는 이유는 무엇인가요?

ls -l은 사람이 보는 목록에 적합하고 readlink는 대상 문자열만 출력하므로 스크립트에서 사용하기 편합니다. 자동화에서는 종료 상태와 파일명 구분 방식도 함께 처리하세요.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / apk - Alpine Linux 패키지 설치·제거와 저장소 갱신

Linux / 명령어 / apk - Alpine Linux 패키지 설치·제거와 저장소 갱신

Linux apk 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

Linux 강좌 / 파일 권한 읽고 바꾸기와 sudo 사용법

리눅스 파일과 디렉터리의 읽기·쓰기·실행 권한을 해석하고 chmod로 실습 파일의 권한을 바꿉니다. sudo의 사용 범위와 권한 오류를 진단하는 순서도 설명합니다.

Linux / 명령어 / rsync - 파일·디렉터리의 변경분 동기화

Linux / 명령어 / rsync - 파일·디렉터리의 변경분 동기화

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

Linux / 명령어 / time - 명령 실행 시간 측정

Linux / 명령어 / time - 명령 실행 시간 측정

Linux time 명령어로 명령과 파이프라인의 실행 시간 및 자원 사용량을 측정하는 방법을 설명합니다. Bash 예약어와 GNU /usr/bin/time의 차이, 출력 저장과 정확한 비교 방법을 정리합니다.

Linux / 명령어 / su - 사용자 계정 전환

Linux / 명령어 / su - 사용자 계정 전환

Linux su 명령어로 다른 사용자 권한의 셸과 단일 명령을 실행하는 방법을 설명합니다. su와 su --login 차이, 환경 변수, PAM 인증, sudo·runuser 선택 기준과 보안 주의사항을 정리합니다.

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

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

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

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

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

Linux / 명령어 / readlink - 심볼릭 링크 대상 경로 확인

Linux / 명령어 / readlink - 심볼릭 링크 대상 경로 확인

Linux readlink 명령어로 심볼릭 링크에 저장된 대상 경로를 확인하는 방법을 설명합니다. 상대 링크, 깨진 링크, 경로 정규화 옵션과 realpath의 차이도 정리합니다.

Linux / 명령어 / scp - SSH로 로컬·원격 파일 복사

Linux / 명령어 / scp - SSH로 로컬·원격 파일 복사

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

Linux / 명령어 / dig - DNS 레코드와 응답 자세히 조회

Linux / 명령어 / dig - DNS 레코드와 응답 자세히 조회

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