심볼릭 링크 새 대상

심볼릭 링크 새 대상

현재 디렉토리를 가리키는 심볼릭 링크를 /pool이라는 공용 디렉토리로 변경하고 싶습니다.

현재 디렉터리 a/b 공용 디렉터리 a/pool

나는 내가 찾을 수 있는 모든 것을 따랐고 이 스크립트로 끝났습니다.

#!/bin/sh
from="$1"
to="$2"
shift 2
for i
do
  a=$(readlink "$i") && ln -sf "$(echo $a | sed "s@$from@$to@")" "$i"
done

스크립트를 실행하기 전에...

lrwxrwxrwx 1 neysa neysa  18 Jan  4 22:03 xfsm-logout.png -> system-log-out.png
lrwxrwxrwx 1 neysa neysa  17 Jan  4 22:03 zoom-best-fit.png -> zoom-fit-best.png

./rename-links 스크립트를 실행한 후. ../수영장/

lrwxrwxrwx 1 neysa neysa  25 Jan  4 22:31 xfsm-logout.png -> ../pool/ystem-log-out.png
lrwxrwxrwx 1 neysa neysa  24 Jan  4 22:31 zoom-best-fit.png -> ../pool/oom-fit-best.png

작동하지만 버그가 있습니다. 대상의 첫 글자가 누락되었습니다. 내가 뭘 잘못했나요?

답변1

. 정규식 메타 문자입니다sed, 이는 임의의 단일 문자와 일치합니다. 다음과 같이 $from정규식에 경로를 직접 삽입 하기 때문입니다 ..

sed "s@.@../pool/@"

당신 자신. 저것바꾸다한 번에 " "가 있는 단일 문자 ../pool/이므로 첫 번째 문자를 삭제하고 그 자리에 "../pool/"을 삽입하는 효과가 있습니다.

명령을 수동으로 실행 하면 이것이 링크 내용의 일부가 아니라는 readlink것을 알게 될 것입니다 . 디스플레이는 동일합니다../ls

.링크 콘텐츠에 표시될 수도 있고 표시되지 않을 수도 있으므로 최소한 스크립트에서 특수 사례 ""를 사용해야 합니다 . 한 가지 옵션은 다음을 사용하는 것입니다.readlink -fon link 및 on .- 이는 두 가지 모두에 대한 절대 경로를 제공합니다. 그러나 단일 사례만 처리해야 하는 경우 더 간단한 옵션이 있습니다.


안에 있으면 완전히 bash나가도 돼sed기본 매개변수 확장 사용:

ln -sf "${a/$from/$to}" "$i"

이는 $from확장을 in으로 대체하고 문자 그대로 처리합니다(비록 다른$to$a.*껍데기메타문자를 사용하세요. "${a/"$from"/"$to"}"실제로는 피해야 합니다. 전반적으로 이는 더 깨끗하고 간단한 접근 방식입니다.

관련 정보