심볼릭 링크가 작동하지 않는 이유는 무엇입니까?


24

나는 상징적 인 링크를 더 잘 이해하려고 노력하고 있습니다 ... 그리고 운이별로 없습니다. 이것은 사용자 이름 / 호스트가 변경된 실제 쉘 출력입니다.

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

심볼릭 링크는 파일에 직접 액세스하는 것처럼 가리키는 파일에서 조작 할 수 있다는 의미에서 투명하게 작동해야한다고 생각했습니다 ( rm물론 링크가 단순히 제거되는 경우는 제외) ).


디스크는 어떻게 포맷되어 있습니까? 어떤 파일 시스템을 사용하고 있습니까? (FAT는 심볼릭 링크를 지원하지 않지만 FAT 파일 시스템에서 만들려고하면 오류가 발생합니다.)
Nicole Hamilton

@NicoleHamilton-ext4 (에 따르면 df -T)-위의 결과가 당신에게도 이상합니까?
orokusaki

@orokusaki 이상하지 않습니다. 아래 답변을 참조하십시오. 그냥 머리 위로, 파일을 만질 필요가 없습니다. 그들은 심지어 존재할 필요도 없습니다. 타이핑을 절약하기 위해!
nerdwaller

답변:


50

심볼릭 링크는 전체 경로를 선호하거나 링크를 기준으로하는 경향이 있습니다. 그렇지 않으면 file-1.txt로컬에서 (이상하게도) 찾을 수 있습니다.

탐색 proper하고 실행 ls -l하면 심볼릭 링크가 actual/file-1.txt필요할 때 찾고 있음을 알 수 있습니다 ../actual/file-1.txt.

따라서 두 가지 옵션이 있습니다.

  1. 전체 경로를 제공

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. 링크를 포함 할 폴더로 이동하여 거기에서 링크

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

편집 : 타이핑을 저장하는 힌트.

넌 그냥 할 수있어 ln -s ~/actual/file-{1,2}.txt ~/proper

중괄호 안의 항목은 서로 대체되고 배치되어 명령을 작성합니다.

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

두 파일을 대상 디렉토리에 연결합니다. 쉘에서 더 나아갈 때 주요 타이핑을 저장합니다.


2
감사합니다. 답을 읽기 전에 머리를 뽑으려고했습니다.
orokusaki

1
때로는 혼란 스럽습니다! 리눅스는 매우 문자적인 경향이 있기 때문에 무언가를한다고한다면 그렇게 될 것이다. 그런 식으로 심볼릭 링크 폴더에주의를 기울이십시오. 앞으로 슬래시없이 이름을 지정하십시오. 또한 rm -rf *심볼릭 링크 폴더로 연결 하지 마십시오 . 링크 된 폴더를 지울 수 있습니다. rm symlinkname을 수행하십시오. 내가 실수 한 것 몇 가지 : D
nerdwaller

3

문제는 상대 경로의 사용입니다. 전체 명시 적 경로로 링크 작성을 지정하면 작동합니다.

$ ln -s ~ / actual / file1.txt ~ / actual / file2.txt ~ / proper /

$ 고양이 적절한 / file1.txt

파일 1

$

이 예에서는 proper의도 한 부모 둘 다가 아니라 현재 디렉토리에서 actual이라는 서브 디렉토리를 찾는 링크를 작성 합니다.


1

심볼릭 링크는 까다로울 수 있습니다. 본질적으로, 심볼릭 링크는 다른 파일의 파일 이름 / 경로 이름을 포함하고 특별한 처리를 위해 플래그가 지정된 파일입니다. 링크 파일의 경로 이름이 ' /'로 시작 하면 절대 경로 이름으로 취급되며 상황이 매우 간단합니다. 슬래시로 시작하지 않으면 링크가있는 디렉토리를 기준으로 상대 경로 이름으로 취급됩니다. 이름에 슬래시가 포함되어 있는지 여부에 관계없이 적용됩니다. 따라서 proper/file–1.txtactual/file–1.txt”에 대한 링크로 작성 했으며 액세스하려고 할 때 시스템이 액세스하려고했습니다 proper/actual/file–1.txt. 말 했어야 했어

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

그건 그렇고, 당신은 touch명령이 필요하지 않았습니다 .  echo "file 1" > actual/file–1.txt만들기에 충분합니다 actual/file–1.txt.


0

관련 문제이며 많은 사람들에게 명백 할 수 있지만 몇 분 동안 저를 엉망으로 만들었습니다. 심지어 링크 된 디렉토리 내에서 심볼릭 링크를 만들거나 현재 작업 디렉토리의 경로 내에 심볼릭 링크가있는 경우 심볼릭 링크가 작동하지 않는 문제가 발생했습니다.

사용 cd ..하고 ls -l당신의 부모 디렉토리 자체가 심볼릭 링크 있는지 확인하기 위해 반복.

cd원본 대상 디렉토리에 대한 심볼릭 링크를 만들고 거기에 새로운 심볼릭 링크를 만들어야 할 경우 상대 경로가 정확합니다.

또는 다시 말하면 상대 경로는 원점에서 대상까지입니다. 그 다음에 Origin이 심볼릭 링크되어 있으면 괜찮습니다. 그러나 어떻게 든 심볼릭 링크 된 디렉토리 내에 새로운 Origin link_name을 설정하는 데 문제가 발생할 수 있습니다.


1
" cd ..그리고 ls -l반복적으로" 대신에을 사용할 수 있습니다 namei -mox $PWD. 경로를 따라 심볼릭 링크가 있는지 확인하는 또 다른 유용한 방법은 사용하는 것입니다 pwd -P당신이 그렇다면 (모든 심볼릭 링크가 포함되지 않은 현재 디렉토리 경로를 제공하는, pwd그리고 pwd -P서로 다른 출력을 제공을, 당신은 길을 따라 심볼릭 링크의 어딘가가 알고 ).
Ansa211

0

존재하지 않는 (또는 경로를 잘못 지정한) 파일에 대한 링크를 만들려고하면 ln -s에서 오류가 발생하지 않습니다. 링크를 만들지 만 해당 링크에서 'cat'을 시도하면 파일을 찾을 수 없습니다. ls를 사용하여 볼 수있는 경우에도. 이러한 경우 항상 파일 경로를 다시 확인하십시오.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

etc / ufw / ufw.conf 파일이 존재하지 않기 때문입니다. 올바른 경로는 /etc/ufw/ufw.conf입니다.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low

이미 더 나은 답변이 있으며 첫 번째 부분은 ln -s"때때로"목표의 존재를 확인하지 않는 것입니다.
RalfFriedl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.