cp의 대상 경로가 디렉터리인 경우 해당 디렉터리에 파일이 잘못 생성되는 것을 방지하려면 어떻게 해야 합니까?

cp의 대상 경로가 디렉터리인 경우 해당 디렉터리에 파일이 잘못 생성되는 것을 방지하려면 어떻게 해야 합니까?

내 이해는 cp src dest다음과 같습니다

  1. src파일이고 존재 dest하지 않지만 상위 디렉터리가 존재하는 경우 dest생성합니다.
  2. src파일이고 파일 dest이면 dest의 내용으로 덮어쓰여집니다 src.
  3. 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기본 작업은 여전히 ​​근본적으로 원자적이지 않습니다. 당신이 하는 일은 공격 표면을 줄이는 것이지 제거하는 것이 아닙니다.)

관련 정보