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


11

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

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

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

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

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

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

답변:


8

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

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

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


1
고마워, $$내 경우 에는 이중 이 매크로 안에 있기 때문에 물론입니다. 그리고 물론 당신의 라인은 내가 사용하는 것의 변형입니다. 그러나 적어도 나는 이것이 옵션으로 존재하지 않는다는 것을 알고 있으며 나 자신을 제공해야합니다.
0xC0000022L

1
@ 0xC0000022L 그런데 몇 년 동안 btrfs가 ext4를 대체 할 때 스크랩을 사용 ln하고 사용 하려고 할 수 있습니다 cp --reflink=auto(업데이트 된 답변 참조).
Gilles 'SO- 악마 그만해'

고마워요. 나는 어느 시점에서 그 옵션을 보았지만 그것을 알지 못했습니다.
0xC0000022L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.