파일 이름을 바꾸면 작동하지만 소프트 링크는 이전 이름을 가리킵니다. 이 문제를 어떻게 해결할 수 있나요?

파일 이름을 바꾸면 작동하지만 소프트 링크는 이전 이름을 가리킵니다. 이 문제를 어떻게 해결할 수 있나요?

예를 들어, 다음과 같이 트리에 있는 많은 파일의 이름을 바꿉니다.

[bash]$ for file in `find . -name "*gsf*"`; do `mv $file ${file/gsf/msf}`; done

파일 이름 일치에서 "gsf"의 모든 인스턴스 이름이 변경됩니다.GSF"msf"로 변경되었지만 소프트 링크는 "gsf"가 포함된 현재 존재하지 않는 파일을 계속 가리킵니다.

예를 들어, 이름을 바꾼 후에는 다음이 발생합니다.

lrwxrwxrwx 1 trusktr users     20 Apr 25 14:39 libmsf-1.so -> libgsf-1.so.114.0.23
lrwxrwxrwx 1 trusktr users     20 Apr 25 14:39 libmsf-1.so.114 -> libgsf-1.so.114.0.23
-rwxr-xr-x 1 trusktr users 265584 Apr 21 04:41 libmsf-1.so.114.0.23

보시다시피, 가리키는 소프트 링크는 libgsf-1.so.114.0.23이름이 로 바뀌었기 때문에 더 이상 존재하지 않습니다 libmsf-1.so.114.0.23.

소프트 링크 포인터의 이름도 바꾸려면 어떻게 해야 합니까?

답변1

기술적인 설명과 별도로 답변이 되었습니다. 심볼릭 링크가 가리키는 위치를 변경할 수 있습니다.

  1. 그들을 찾아라find . -type l
  2. 목표를 바꾸다ln -sfT target link_name

-sfT옵션은 다음과 같이 지정 해야 합니다 .리디렉션심볼릭 링크는 놀라운 일이 아닙니다.

답변2

아무것도 아닙니다. 그것이 심볼릭 링크를 만드는 이유입니다. 직접 처리해야 합니다. 하드 링크는 파일 시스템의 실제 인덱스 노드("inode")를 참조하므로 유효한 상태로 유지됩니다. 이것이 바로 이 경우 기호 링크 대신 하드 링크를 사용하려는 이유입니다.

답변3

@C2H5OH 및 @user1277476의 답변을 바탕으로 해결책을 찾았습니다.

$ for file in `find . -type l`; do link=$(readlink $file); ln -sfT ${link//gsf/msf} $file; done

답변4

주석을 추가할 수 없기 때문에 여기 버전은 링크를 찾기 위해 셸을 호출하지 않으므로 fork() 및 기타 시스템 호출로 인한 추가 오버헤드가 방지됩니다.

for file in $(find . -type l); do 
    link=$(readlink $file); 
    ln -sfT ${link//gsf/msf} $file; 
done

이것은 @trusktr의 답변을 기반으로 합니다.

관련 정보