`–link`를 표현할 수있는 방법이 있습니까, 아니면 cp (GNU coreutils에서)의 일반 사본으로 대체됩니까? 수 있습니다. 내가

말할 cp수 있는 방법이 있습니까 --link(예 : 하드 링크 만들기) 장치 간 하드 링크를 시도하는 경우에 다시 사용합니까? 장치 간 링크가 불가능 cp하여 실패 할 수 있습니다.

내가 묻는 이유는 이것을 이것을 사용하고 싶습니다. 왜냐하면 GNUmakefile복잡하고 긴 명령 (또는 그 문제에 대한 기능)보다 읽기 쉬운 명령 줄을 선호하기 때문입니다.

문제는 GNU coreutils (7.4 및 8.13)에 관한 것입니다.

참고 : 현재 해결 방법은 (GNU make recipe 구문)과 같습니다.

cp -fl $^ $@ || cp -f $^ $@

물론 두 번째 cp호출 에서 성공하더라도 장치 간 링크의 경우 잘못된 오류 메시지가 표시됩니다 . 또한 이것은 확장되어 (소스 형식은 읽을 수있는 것처럼 보입니다) 더 이상 읽을 수 없습니다.



답변

cp이 옵션이 없습니다. 래퍼 스크립트를 작성할 수 있지만 매우 간단합니다.

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5는이 --reflink옵션을 도입했습니다 . 통과 --reflink=auto하고 기본 파일 시스템이 기록 중 복사 (예 : Btrfs 또는 ZFS)를 지원하고 사본이 동일한 장치에있는 cp경우 새 inode를 작성하지만 컨텐츠는 복사하지 않습니다. 그렇지 않으면 cp일반 복사를 수행합니다. 이것은 여전히 ​​하드 링크는 아니지만 (대상은 항상 다른 inode입니다) 사용 사례에 더 적합 할 것입니다. 그러나 쓰기시 복사를 지원하지 않는 ext4 (현재 대부분의 사람들과 같은)를 사용하는 경우 도움이되지 않습니다.