디렉터리를 복사하지만 파일이 대상에 이미 있으면 실패합니다.

디렉터리를 복사하지만 파일이 대상에 이미 있으면 실패합니다.

cp -a foo/* bar/foo의 내용을 bar에 복사하여 이미 존재하는 모든 파일을 대체합니다. -n 플래그를 사용하여 cp기존 파일을 덮어쓰지 않도록 하거나 -i파일을 덮어쓸지 여부를 대화식으로 묻도록 할 수 있습니다.

질문

  • cp파일이 이미 존재하는 경우 실패하고 오류 코드를 반환하는 방법이 있습니까 ?
  • rsync그렇지 않다면 다른 일반적인 도구를 사용하여 수행할 수 있습니까 ?

답변1

리눅스

Linux에 파일이 존재하는 경우 GNU를 사용한 약간의 해킹을 통해 실패할 수 있습니다 nohup. 대화형 프롬프트가 무시 되도록 nohup리디렉션 하지만 사용을 실패로 처리합니다./dev/nullstdinstdin

$ nohup cp -ia foo/* bar/

조금 정리하려면 다음을 수행하십시오.

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • 기본적으로 및 로 리디렉션 nohup됩니다 .stdoutnohup.outstderrstdout
  • 2>nohup.outstderr파일에도 넣습니다 .
  • && rm || cat성공하면 정리되고 오류가 발생하면 오류가 출력 됩니다 nohup.out. 오류 처리를 포함/포함하는 대신 원하는 오류 처리를 추가하거나 cat모두 제거하고 $?정상적으로 처리할 수 있습니다.
  • 본격적으로 사용하려면 임시 파일 위치에 대해 좀 더 현명하게 대처해야 합니다. ( mktemp -d)

BSD

BSD에서는 0이 아닌 상태 로 처리되어 반환될 위치 stdin로 리디렉션할 수 있습니다 .cpn

$ cp -ia foo/* bar/ </dev/null

OSX

OSX에서는 놀랍게도 BSD와 다르게 동작하며 건너뛴 파일에 대해 cp0이 아닌 상태를 반환합니다 .-n

$ cp -n foo/* bar/

관련 정보