내가 액세스할 수 없는 디렉토리에서 실행되는 다른 팀의 누군가를 위해 심볼릭 링크 스크립트를 작성했는데 이로 인해 예상치 못한 동작이 발생하는 것 같았습니다.
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
필요한 작업을 수행하는 것이 만족스러우면 세 인스턴스를 모두 삭제하세요.