운영체제/Linux

[Linux] readlink - 링크걸린 파일의 원본 파일 출력

louky 2024. 11. 6. 09:25
반응형

또.... 끄적 거려 봅니다.

리눅스를 사용하다보면 필요 또는 의도치 않게 링크걸린 파일을 사용하거나 설정을 해야 할때가 있습니다. 

링크가 정상적으로 설정되어 있고 사용할때는 크게 불편하거나 문제가 되는 부분은 없습니다. 

 

다만, 링크 설정된 파일의 원본 파일을 찾고자 할때가 종종 있습니다. 

링크된 파일이 어느 파일인지 알아야 할때가 있습니다.

 

필자의 경우 아래와 같이 종종 확인 하였습니다.

$ ls -al /etc/localtime
lrwxrwxrwx 1 root root 30 Nov  6 08:31 /etc/localtime -> /usr/share/zoneinfo/Asia/Seoul

 

간단하게 확인 할 때는 주로 ls 명령어를 통해 확인 하였습니다. (다른 더 좋은 방법이 있다면..... 댓글 부탁드립니다.)

 

하지만 script 등으로 확인 또는 원본 파일을 알아야 할때는 아래와 같이 하였습니다.

$ ls -al /etc/localtime | awk '{print $(NF)}'
/usr/share/zoneinfo/Asia/Seoul

## sciprt상의 변수로 사용시 
ORIGINAL_LINK_FILE=$(ls -al /etc/localtime | awk '{print $(NF)}')

 

위의 방법이 틀린것은 아니지만 뭔가 불편아닌 불편하다는 걸 알게 되었습니다. 

 

복잡하게 ls 와 awk를 사용할것이 아니라 readlink라는 명령어를 사용하면 되는 것이였습니다. 

usage)    readlink [file]
$  readlink /etc/localtime
/usr/share/zoneinfo/Asia/Seoul

 

 

즉,  링크 설정된 파일을 확인하면 원본파일의 정보를 출력하는 것이였습니다. 

readlink 명령어가 꼭 정답은 아니지만 그래도 편리하게 사용할 수 있는 것이라면 좋을것 같아보입니다. 

 

많지는 않지만 그래도 아래와 같이 몇가지 옵션이 있습니다. 

 

$ readlink --help
Usage: readlink [OPTION]... FILE...
Print value of a symbolic link or canonical file name

  -f, --canonicalize            canonicalize by following every symlink in
                                every component of the given name recursively;
                                all but the last component must exist
  -e, --canonicalize-existing   canonicalize by following every symlink in
                                every component of the given name recursively,
                                all components must exist
  -m, --canonicalize-missing    canonicalize by following every symlink in
                                every component of the given name recursively,
                                without requirements on components existence
  -n, --no-newline              do not output the trailing delimiter
  -q, --quiet
  -s, --silent                  suppress most error messages (on by default)
  -v, --verbose                 report error messages
  -z, --zero                    end each output line with NUL, not newline
      --help     이 도움말을 표시하고 끝냅니다
      --version  버전 정보를 출력하고 끝냅니다

 

옵션을 적절히 사용하면 편리할듯 보입니다. 

 

옵션 중 필자가 확인해보니 아래 옵션이 사용하기 편해 보였습니다. 

usage) readlink -e [file]

#결과
# 링크가 걸려 있을땐 링크원본 파일을 출력
# 링크가 걸린 파일이 아닐 경우 파일의 절대 경로 출력
# 없는 파일일 경우 아무 출력 없고 return code가 1로 출력

 

테스트 

# 링크된 파일일 경우 
$ readlink -e /etc/localtime
결과 => /usr/share/zoneinfo/Asia/Seoul

#링크된 파일이 아닐 경우 
$ readlink -e /etc/crontab
결과 => /etc/crontab

# 해당 파일이 없을 경우 
$ readlink -e /etc/crontab-aaaa
결과 => 결과 없음

 

 

혹시라도 더 좋은 방법이 있다면 댓글 또는 공유 부탁 드립니다. 

 

반응형