깨진 심볼릭 링크를“다시 링크”하는 방법은 무엇입니까?


54

나는 아래의 파일에 대한 심볼릭 링크의 무리가있는 디렉토리 트리가 /home... 그러나, 나는 이사 /home에를 /mnt/home하고 심볼릭 링크의 모든 "다시 연결"하는 방법이 필요합니다. 그러한 기능이 존재합니까, 아니면 스크립트를 작성해야합니까?

예를 들어 다음과 같은 것이 있습니다.

[root@trees ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

모든 심볼릭 링크를 찾아 같은 위치에 있지만 /mnt/home대신 그 대신에 링크하는 명령을 원합니다./home

그러한 명령이 있습니까?

답변:


55

심볼릭 링크의 대상을 변경하라는 명령은 없습니다. 링크를 제거하고 다른 링크를 작성하기 만하면됩니다. 당신이 GNU 유틸리티를 가정하면 (예를 들어 비 임베디드 리눅스 또는 Cygwin에서 아래), 당신은 사용할 수 -lname의 차를 find자신의 목표로 심볼릭 링크를 일치하고, readlink링크의 내용을 읽을 수 있습니다. 테스트되지 않은 :

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

이러한 심볼릭 링크를 상대적으로 만드는 것이 좋습니다. symlinks많은 Linux 배포판에 있는 편리한 작은 유틸리티 (원래 Mark Lords, 현재 J. Brandt Buckley가 유지 관리)가 있습니다. 이동하기 전 또는 위와 같이 유효한 링크를 복원 한 후 symlinks -c /mnt/home/someone/something파일 시스템 경계를 넘지 않는 한 지정된 디렉토리 아래의 모든 절대 심볼릭 링크를 상대 심볼릭 링크로 변환하려면 실행 하십시오.


위법은 없습니다. 이것은 훌륭한 한 줄짜리입니다. 그러나 Bash의 문자열 대체는 아마도 경로 변경으로 약간의 마술을 할 수 있으며 더 쉬울 것입니다.
0xC0000022L

@STATUS_ACCESS_DENIED 어떻게? 유일한 문자열 연산은 /mnt경로 앞에 추가 하는 것입니다. 연결보다 더 멋진 문자열 작업이 필요하지 않습니다.
Gilles

@Gilles : 죄송합니다. 상대 경로에 대한 귀하의 의견에 대해 더 많이 생각하고있었습니다. 예제의 정확한 "번역"을 위해서는 물론 옳습니다.
0xC0000022L

13

나는 이것이 저자가 요청한 것이 아니라는 것을 알고 있지만 이미 답변을 가지고있는 것 같습니다. 그래서 질문에 걸려있는 다른 사람들을 위해 이것을 추가하고 있습니다.

다음은 심볼릭 링크 대상의 일부를 교체하여 해결할 수있는 깨진 심볼릭 링크가 여러 개있는 등보다 유연한 솔루션이 필요한 경우에 도움이됩니다.

예. 사용자 이름을 변경 한 후 이동이 이미 완료된 후 많은 링크의 대상에서 이전 사용자 이름을 새 사용자 이름으로 바꾸십시오. 아래 표시된 replace-simlinks라는 스크립트를 만듭니다.

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm $link
#ln -s "$target" "$link"

다음 명령으로 호출하십시오.

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

이것이 누군가를 돕기를 바랍니다.

편집 :이 스크립트의 킥 스타트와 symlinks 스크립트를 사용하여 링크를 상대적으로 만드는 팁에 대해 Gilles에게 감사드립니다.


1
이 솔루션은 문자열 바꾸기를 사용하기 때문에 경로 중간에 폴더 이름을 변경 해야하는 경우에 도움이됩니다. 이 솔루션은 필요한 경우보다 복잡한 변환을 수행하도록 수정하기도 쉽습니다.
Gallaecio

문자열 대체에 인수를 인용하는 것이 좋습니다. 예를 들어 OP 질문의 경로와 같이 슬래시를 사용하려면이를 수행해야합니다. target=${target/"/home"/"/mnt/home"}그래도 매우 도움이됩니다. 감사.
Walter Nissen

3

/home대한 심볼릭 링크로 생성 /mnt/home하면 기존의 모든 심볼릭 링크가 다시 유효합니다.


2
자주 바인딩 장착이 ... 프로그램이 심볼릭 링크를 인식하고 다른 사실에 의존하여 행동 시나리오에서 심볼릭 링크보다 깨지기 쉬운 경향이있다
0xC0000022L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.