심볼릭 링크는 중첩된 심볼릭 링크를 생성합니다.

심볼릭 링크는 중첩된 심볼릭 링크를 생성합니다.

내가 액세스할 수 없는 디렉토리에서 실행되는 다른 팀의 누군가를 위해 심볼릭 링크 스크립트를 작성했는데 이로 인해 예상치 못한 동작이 발생하는 것 같았습니다.

destination_path=/path/to/dest/
source_path=/path/to/src

for dir in first second
do
    # replace existing symlink
    for subdir in {1000..1020}
    do 
        ln -sf $source_path/$dir/$subdir $destination_path/$dir/$subdir
    done
done

스크립트가 실행되기 전에 다른 디렉토리 세트에 대한 기호 링크를 path/to/dest/$dir포함하십시오 . 1000, 1001, ..., 1020내 스크립트는 이러한 심볼릭 링크를 심볼릭 링크로 대체하도록 설계되었지만 /path/to/src/$dir/$subdir그렇게 하지 않고 대신 기존 심볼릭 링크 내에 심볼릭 링크를 생성합니다.

예를 들어, /path/to/dest/$dir/1000이전에 심볼릭 링크였던 것은 스크립트를 실행한 후에도 /path/to/dest/$dir/1000여전히 동일한 위치를 가리키지만 내부에는 를 가리키는 심볼릭 링크 /path/to/dest/$dir/1000가 있습니다 .1000$source_path/$dir/$subdir/1000

내 스크립트에서는 이런 일이 일어나서는 안 됩니다. 그렇죠? 시뮬레이션된 대상 디렉터리 구조를 사용하여 로컬에서 문제를 재현하려고 시도했지만 문제를 재현할 수 없었습니다.

ln -sfn편집 : 추가 조사를 통해 ln -sf이 문제를 해결하는 가장 쉬운 방법은 무엇입니까?

답변1

디렉토리를 가리키는 심볼릭 링크는 (거의 항상) 해당 디렉토리로 취급됩니다. 일반적으로 심볼릭 링크를 업데이트하려면 해당 링크를 삭제하고 다시 생성하세요.

이와 같은 스크립트 변형을 사용하십시오.

#!/bin/bash
destination_path='/path/to/dest/'
source_path='/path/to/src'

for dir in first second
do
    # replace existing symlink
    for subdir in {1000..1020}
    do 
        s="$source_path/$dir/$subdir"
        t="$destination_path/$dir/$subdir"

        [ -d "$t" ] && [ -h "$d/$subdir" ] && echo rm -f -- "$d/$subdir"
        [ -h "$d" ] && echo rm -f -- "$d"
        echo ln -sf -- "$s" "$d"
    done
done

echo필요한 작업을 수행하는 것이 만족스러우면 세 인스턴스를 모두 삭제하세요.

관련 정보