부드러운 심볼릭 링크의 원본 파일의 전체 경로를 얻는 방법?


99

scp서버에 파일을 보내고 싶습니다 . 파일은 심볼릭 링크이며 실제로 내가 원하는 것은 소스 파일을 복사하는 것입니다. 어쨌든 소스 파일의 경로를 수동으로 추적하고 싶지 않기 때문에 대체 할 수 있습니다. 소스 파일의 절대 경로를 얻을 수 있다면 sep함께 할 수 있습니다 . 경로는 어떻게 알 수 있습니까?


2
대부분의 scp버전은 기본적으로 심볼릭 링크를 따르지 않습니까? 당신은 당신을 확인하고 아마도 자신의 작업을 저장해야합니다.
jw013

@ jw103 알려 주셔서 감사합니다. 몰랐어요 :)
Eonil

2
참고 : scp -r심볼릭 링크를 따르십시오.
Eonil

답변:


129

이 줄을보십시오 :

readlink -f `which command`

경우 command당신에 $PATH, 그렇지 않으면 당신은 당신이 알고있는 경로를 지정해야 변수입니다.


12
-f중간 링크 대상이 존재하는 한 존재하지 않는 최종 대상에 대한 경로를 반환합니다 -e. -e최종 대상이 없으면 null을 반환합니다.
Peter.O

10
-freadlink: illegal option -- fOSX에서 오류가 발생 했습니다. 잘 제거했습니다.
히스 국경

2
@HeathBorders OSX의 경우 homebrew coreutils가 설치되어 있으면 greadlink대신 사용할 수도 있습니다 .
Adam Gent

23

Linux에서는 심볼릭 링크가 아닌 것을 찾을 때까지 심볼릭 링크 readlink의 내용을 읽고 심볼릭 링크에 대한 심볼릭 링크 등을위한 심볼릭 readlink -f링크를 따릅니다.

scp에는 필요하지 않습니다. scp는 항상 심볼릭 링크를 따릅니다 ( -p가능한 경우 파일 시간과 모드 를 유지하는 것을 제외하고는 메타 데이터를 무시하고 항상 파일 내용을 복사 함 ).

메타 데이터 scp이 유지할 수 있고 보존 할 수없는 것에 실망한 경우 rsync를 사용하는 것이 좋습니다. 옵션이 없으면 rsync는 메타 데이터를 무시하고 파일 내용을 복사합니다. 일반적으로 사용되는 옵션 -a은 모든 가든 다양성 메타 데이터 (시간, 기호 링크, 권한 및 소유권)를 유지하며 ACL 및 하드 링크와 같은 이국적인 메타 데이터를 유지하는 옵션이 있습니다.


readlink는 읽기 링크를위한 단일 단계 만 수행합니다. 예를 들어 우분투에는 / bin / zsh가 있습니다. / bin / zsh는 / etc / alternatives / zsh에 심볼릭 링크되어 있지만 두 번째 심볼릭 링크입니다. 마지막으로 실제 파일 또는 디렉토리 경로를 얻지 못합니다. stat 명령도 마찬가지입니다. -f 옵션이있는 readlink 만 모든 해결을 수행합니다.
Znik

9

나는 명령을 사용하여 ls, stat, readlink.

파일 /etc/localtime을 예로 들어

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

조작

스탯 사용

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

readlink 사용

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

그 명령 readlink -f이 더 나은 것 같습니다 .

설명

-f, --canonicalize : 주어진 이름의 모든 구성 요소에있는 모든 심볼릭 링크를 재귀 적으로 따라 가면서 정식화합니다. 마지막 구성 요소를 제외한 모든 구성 요소가 존재해야합니다.man readlink


6

Stat은 다음 정보를 제공합니다.

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...

readlink는 읽기 링크를위한 단일 단계 만 수행합니다. 예를 들어 우분투에는 / bin / zsh가 있습니다. / bin / zsh는 / etc / alternatives / zsh에 심볼릭 링크되어 있지만 두 번째 심볼릭 링크입니다. 마지막으로 실제 파일 또는 디렉토리 경로를 얻지 못합니다. stat 명령도 마찬가지입니다. -f 옵션이있는 readlink 만 모든 해결을 수행합니다.
Znik

5

당신은 할 수 있습니다

readlink -f `which command`

또는 리눅스에서 비슷한 것을 얻을 수 있습니다.

stat `which command` | grep File

이것을 스크립트에 추가하는 경우 오류를 검사하십시오. sym 링크가없는 경우 오류 메시지를보고 싶지 않으면 다음과 같이하십시오.

readlink -f "`which command`" 

-f가없는 stat 및 realink는 단일 단계 만 수행합니다. 그런 다음 readlink -f를 호출하는 것이 좋습니다.
Znik

3

사용 realpath <symlink>합니다.

아마도 'source'라고 부르는 것은 다음 사용법에 따른 'target'파일입니다 ln.Usage: ln [OPTION]... [-T] TARGET LINK_NAME


감사합니다 이것은 매력처럼 작동했습니다! Mac OSX와 함께! readlink자르지 않은 곳 ... 멍청한 맥. lol
JayRizzo

0

readlink -f 'which java' 나를 위해 작동하지 않았다.

그러나 이것은했다 :

readlink -f $(which java)

3
그것이 아니기 때문에 작동 `하지 '않았지만 $()어쨌든 더 나은 연습입니다.
Stephen Rauch

왜 공감해야합니까? 내 대답은 수용 가능한 대안이며 의견에서 알 수 있듯이 더 나은 방법입니다.
NonCreature0714

1
다운 투표권 자도 대부분의 의견을 밝히지 않으므로, 다운 투표권자가 이미 떠났고 다시 올 가능성이 없기 때문에, 다운 투표에 대한 설명을 요청해도 설명을 거의 얻지 못합니다. 답변에서 작동하지 않는 오타가있는 코드를 제거하는 것이 좋습니다. 시간을 내서 정리하고 왜 $()더 나은 방법 인지 설명한다면 기꺼이 투표를하겠습니다 .
Stephen Rauch

스티븐이 당신에게 설명했듯이, '는`가 아닙니다. 로 캡슐화해야 command하지만 더 이상 사용되지 않습니다. 캡슐화 $ ($ (command))가 훨씬 쉽고 특별한 이스케이프가 필요하지 않기 때문에 $ ()를 사용하는 것이 좋습니다. 그렇다면 바람직하다. 첫 번째 예제에서 일반적인 아포스트로피를 사용한 다음 readlink는 이름에 공백이있는 'which java'라는 파일을 찾으려고합니다. 그러나 당신은 자바 바이너리 실행 경로를 찾기 위해 인수 java를 가진 호출 명령입니다.
Znik

0

MAC OX에서 "-f"매개 변수가 작동하지 않으면 'readlink'가 매개 변수없이 작동합니다.

KZs-MacBook-Pro:bin kz$ readlink -f pip3
readlink: illegal option -- f
usage: readlink [-n] [file ...]

KZs-MacBook-Pro:bin kz$ readlink pip3
../../../Library/Frameworks/Python.framework/Versions/3.7/bin/pip3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.