현재 디렉토리를 가리키는 심볼릭 링크를 /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 -f
on link 및 on .
- 이는 두 가지 모두에 대한 절대 경로를 제공합니다. 그러나 단일 사례만 처리해야 하는 경우 더 간단한 옵션이 있습니다.
안에 있으면 완전히 bash
나가도 돼sed
기본 매개변수 확장 사용:
ln -sf "${a/$from/$to}" "$i"
이는 $from
확장을 in으로 대체하고 문자 그대로 처리합니다(비록 다른$to
$a
.
*
껍데기메타문자를 사용하세요. "${a/"$from"/"$to"}"
실제로는 피해야 합니다. 전반적으로 이는 더 깨끗하고 간단한 접근 방식입니다.