개인 스크립트를 설치하기 위한 "install.sh"가 있습니다.
find /home/Steven -name '*.sh' -exec ln -s -t /usr/local/bin {} +
"install.sh"에 의해 생성된 심볼릭 링크를 제거하는 "uninstall.sh"를 만들고 싶습니다. 나는 이것을 썼다:
for z in /usr/local/bin/*
do
if [ -h "$z" ]
then rm "$z"
fi
done
그러나 대상이 "/home/Steven" 아래에 있는 심볼릭 링크뿐만 아니라 모든 심볼릭 링크도 삭제됩니다.
답변1
GNU나 BSD가 있다면 find
다음과 같이 하면 됩니다:
find -lname '/home/Steven/*' -delete
답변2
스크립트를 수정하고 grep
또는 를 사용하여 원하는 하위 디렉터리에 파일을 추출할 수 있습니다. 예를 들면 다음과 같습니다 readlink
.realpath
for z in /usr/local/bin/*
do
if [ -h "${z}" ] && readlink -f "${z}" | grep -q '^/home/Steven'
then rm "${z}"
fi
done
이 readlink -f
명령은 심볼릭 링크가 가리키는 파일의 전체 경로를 반환합니다. grep -q '^/home/Steven'
이 명령은 경로가 하위 문자열 "/home/Steven"으로 시작하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
주의 사항: 기호 링크와 관련된 일부 모호함이 여기 결과에 영향을 미칠 수 있습니다. 이 readlink -f
명령은 링크를 재귀적으로 확인하므로 디렉터리의 파일 /home/Steven
자체가 해당 디렉터리 외부의 심볼릭 링크 지점인 경우 위 명령은 실패합니다. 이것이 원하는 동작이 아닌 경우 대신 이 명령을 사용해야 할 수도 있습니다 realpath
.
답변3
링크가 상대적일 수 있는 경우를 다루고 해당 표준 경로가 내에 있는지 확인하려면 다음을 수행 하십시오 /home/Steven
.zsh
rm /usr/local/bin/*(@e{'[[ $REPLY:A = /home/Steven/* ]]'})
어디:
@
기호 링크와 일치하는 Glob 한정자:e{code}
코드($REPLY
확인할 파일의 경로 포함) 와 일치하는 glob 한정자를 평가합니다.$REPLY:A
절대 경로로 확장됩니다$REPLY
.