cp 명령은 대상의 심볼릭 링크를 따라가며 링크를 덮어쓰는 대신 연결된 대상을 삭제합니다.

cp 명령은 대상의 심볼릭 링크를 따라가며 링크를 덮어쓰는 대신 연결된 대상을 삭제합니다.

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에 대해서도 매우 혼란스럽습니다.chowntest[ .. ]

먼저 심볼릭 링크를 제거하십시오.( rm -f sd/common.py), 그 다음에 cp.

물론, 시스템마다 버전마다 cp이를 수행하는 옵션이 다르지만 방심하기 쉽습니다.

당신이 할 수 있는 또 다른 일은 cp심볼릭 링크 결과를 피하고 목표로 삼는 것입니다. ln -sf SOURCE DESTINATION(두 매개변수 모두 절대 경로입니다.) 더 이상 혼란을 일으키지 않고 모든 POSIX 시스템에서 작동합니다. -f기존 DESTINATION파일/symlink를 삭제합니다(아아, 디렉토리는 제외). realpath이를 상대/절대 경로 문제 방지와 결합 할 수 있습니다 .

ln -sf "$(realpath "$SOURCE")" "$(realpath "$DESTINATION")"

관련 정보