sd/common.py -> actual_file
생성된 파일로 대체하려는 심볼릭 링크가 있습니다 .
하지만, 그럴 때마다
cp /tmp/Star_Wrangler/common.py sd/common.py
... 내가 원하는 대로 심볼릭 링크를 교체하는 대신 복사 /tmp/Star_Wrangler/common.py
하고 덮어씁니다 . actual_file
복사하기 전에 심볼릭 링크를 제거하는 것을 잊을 때마다 이런 일이 발생합니다.
내가 기대하는 동작을 얻을 수 있는 옵션이 있습니까? 매뉴얼을 보았지만 모두 대상에 대한 심볼릭 링크가 아니라 소스에 대한 심볼릭 링크에 대해 이야기합니다.
답변1
어떤 Unix를 사용하고 있는지에 따라 다릅니다.
cp -f
일부 BSD 시스템(OpenBSD, FreeBSD)에서는 심볼릭 링크의 링크를 해제(제거)하고 소스 코드로 대체하는 것을 볼 수 있습니다 .
GNU에서는 cp
동일한 효과가 없으므로 long 옵션을 사용해야 합니다 --remove-destination
.
macOS에서는 cp -c
매뉴얼에 설명된 대로 "파일 복사"를 사용하십시오 clonefile(2)
.
NetBSD에서는 cp -a
("아카이브 모드", 이 시스템과 동일 cp -RpP
)을 사용하십시오. 모든 시스템에 동일하거나 유사한 -a
옵션이 있더라도 GNU, macOS, OpenBSD 또는 FreeBSD에서는 작동하지 않습니다 cp
(GNU 시스템에서는 동일함 -dR --preserve
).
당신은 이것을 직접 언급했습니다: 파일을 복사하기 전에 링크를 제거하면 문제가 해결됩니다. 이 rm
유틸리티는 링크에서 참조하는 파일이 아닌 링크를 삭제합니다. 이는 또한 기호 링크를 일반 파일로 대체하는 가장 이식 가능한 방법이기도 합니다.
스크립트를 작성하는 rm
경우 cp
.
대화형으로 작업하면서 이 작업을 계속 잊어버리면 cp
이러한 상황에 대한 특정 옵션을 사용하는 것도 잊어버릴 수 있습니다.
답변2
심볼릭 링크의 동작은 심볼릭 링크뿐만 아니라 cp
내장 함수 (또는 해당 별칭) chmod
에 대해서도 매우 혼란스럽습니다.chown
test
[ .. ]
먼저 심볼릭 링크를 제거하십시오.( rm -f sd/common.py
), 그 다음에 cp
.
물론, 시스템마다 버전마다 cp
이를 수행하는 옵션이 다르지만 방심하기 쉽습니다.
당신이 할 수 있는 또 다른 일은 cp
심볼릭 링크 결과를 피하고 목표로 삼는 것입니다. ln -sf SOURCE DESTINATION
(두 매개변수 모두 절대 경로입니다.) 더 이상 혼란을 일으키지 않고 모든 POSIX 시스템에서 작동합니다. -f
기존 DESTINATION
파일/symlink를 삭제합니다(아아, 디렉토리는 제외). realpath
이를 상대/절대 경로 문제 방지와 결합 할 수 있습니다 .
ln -sf "$(realpath "$SOURCE")" "$(realpath "$DESTINATION")"