모든 다중 홉 심볼릭 링크를 재귀적으로 다시 연결하여 최종 대상에 직접 연결합니다.

모든 다중 홉 심볼릭 링크를 재귀적으로 다시 연결하여 최종 대상에 직접 연결합니다.

중간자 링크를 재귀적으로 제거하는 방법은 무엇입니까? 예를 들어:

somelink -> someintermediarylink -> actualfile.txt

될 것입니다

somelink -> actualfile.txt

디렉토리 및 하위 디렉토리의 모든 파일에 대해(즉, 재귀적으로)

아이디어가 있나요?

답변1

GNU 도구 사용:

find . -type l ! -xtype l -exec sh -c '
  for link do
    target=$(readlink -e -- "$link") &&
      ln -svTf -r -- "$target" "$link"
  done' sh {} +

깨지지 않은 모든 심볼릭 링크를 상대 링크로 변경하고 대상에 심볼릭 링크 구성 요소가 없습니다.

-r절대 심볼릭 링크를 원하면 삭제하세요.

이러한 기호 링크가 가리키는 파일의 정식 절대 이름은 개행 문자로 끝나지 않는다고 가정합니다(명령 대체의 일반적인 제한은 모든 후행 개행 문자를 제거하는 것입니다).

답변2

#!/bin/bash
# Usage: ./relinkToFinalDestination directory_path
directory=$1
find -L $directory -xtype l | while read file; do
    next_hop=$(readlink "$file")
    if [[ -e $next_hop ]]; then
      final=$(readlink -e "$file")
      echo "Got final path for $file --> $final"
      # Update the link
      ln -sf "$final" "$file"
    fi
done

관련 정보