특정 디렉토리에서 시작되는 심볼릭 링크 제거

특정 디렉토리에서 시작되는 심볼릭 링크 제거

개인 스크립트를 설치하기 위한 "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.

관련 정보