내 이해는 cp src dest
다음과 같습니다
src
파일이고 존재dest
하지 않지만 상위 디렉터리가 존재하는 경우dest
생성합니다.src
파일이고 파일dest
이면dest
의 내용으로 덮어쓰여집니다src
.src
파일과dest
디렉터리 인 경우dest/src
생성합니다.
나는 상황 #3을 피하려고 노력하고 있습니다. 가정하고 스크립트를 작성하면dest
에 익숙해디렉토리이지만 런타임에 발견되었습니다.예,cp
파일을 엉뚱한 곳에 넣기 싫고 조용히 계속하고 싶습니다.
대신에 나는 다음을 원합니다:
- 전체
dest
디렉터리를 삭제하고 필요한 파일로 바꿉니다. - 아무런 조치도 취하지 않고 오류가 발생합니다.
나는 또한 이것이 원자적으로 일어나기를 원합니다. TOCTTOU 문제는 별도의 명령(예: 디렉터리 test -d
인지 확인 )을 사용하여 발생할 수 있습니다.dest
이것이 가능합니까 cp
? 그렇지 않은 경우 다른 유사한 범용 명령을 사용하여 수행할 수 있습니까?
나는 휴대용 솔루션과 비표준 확장에 의존하는 솔루션(합리적으로 일반적이라면) 모두에 관심이 있습니다.
답변1
리디렉션이 바로 그 역할을 합니다. 이는 's 와 동일하게 작동합니다 cp
( -T, --no-target-directory
디렉토리인 경우 오류와 함께 종료됩니다).dst
$ cat src > dst
답변2
절대 호환성에 관한 한 복사를 시도하기 전에 대상 디렉터리를 확인할 수 있습니다.
뭔가 잘못됐거나,
[ -d dest ] && echo "${0##*/}: is a directory: dest" >&2 && exit 1
cp src dest
또는 자동으로 대상을 제거
[ -d dest ] && rm -rf dest
cp src dest
디렉터리를 삭제하고 파일로 바꾸는 데 사용할 수 있는 원자성 작업은 없습니다. (와 같은 명령을 찾을 수 있지만 cp --no-target-directory
기본 작업은 여전히 근본적으로 원자적이지 않습니다. 당신이 하는 일은 공격 표면을 줄이는 것이지 제거하는 것이 아닙니다.)