scp가 항상 디렉터리를 덮어쓰거나 생성하도록 설정

scp가 항상 디렉터리를 덮어쓰거나 생성하도록 설정

scp를 사용하여 한 원격 서버의 디렉터리를 다음과 같은 다른 원격 서버의 새 디렉터리(즉, 이름만 변경함)로 복사하고 있습니다.

scp -prq server1:dir1 server2:dir2

dir2가 server2에 없으면 제대로 작동하며 server1의 dir1의 모든 내용을 포함하는 dir2라는 새 디렉터리를 만듭니다.

문제는 dir2가 server2에 이미 존재할 때 발생합니다(참고: 이를 미리 알거나 server2의 dir2에서 제거를 미리 수행할 방법이 없습니다). 무슨 일이 발생하면 dir2에서 dir1이라는 dir1의 복사본을 얻게 됩니다.

제가 놓치고 있는 기본적인 것이 있다고 확신하지만 그것을 해결할 수 없는 것 같습니다.

도움을 주시면 감사하겠습니다!

문안 인사,

자일스

좋아요, 저는 담당자가 10명 미만이고 8시간을 기다리라고 할 수 없습니다. 그래서 제가 얻은 것은 다음과 같습니다.

나에게 맞는 스크립트는 다음과 같습니다.

#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null  2>&1

if [ "$?" -ne "0" ]; then
        echo "failed ... trying method 2"
        scp -prq server1:dir1 server2:dir2
fi

exit

단일 명령으로 이 작업을 수행하는 방법이나 가능한 경우에도 여전히 확실하지 않습니다.

@mindthemonkey를 응원합니다. 때로는 새로운 관점을 얻는 것만으로도 길을 찾는 데 도움이 될 수 있습니다.

답변1

다음 "점" 구문을 사용하세요.

scp -prq server1:dir1/. server2:dir2/

이렇게 하면 디렉터리 자체가 아닌 해당 디렉터리의 내용이 복사됩니다. 그리고 나는 그것이 *globbing보다 휴대성이 더 좋다고 믿습니다.

답변2

일반적으로 디렉토리 생성을 제어하려면 후행을 사용하여 전체 경로를 암시해야 /하지만 디렉토리가 존재하지 않으면 디렉토리 생성에 실패할 것 같습니다.

scp -prq server1:dir1/* server2:dir2/

이것은 또한 Hidden 을 놓칠 수도 있습니다. * glob 확장으로 인한 파일(일부 제외)까다로운 쉘 특정 작업)

ssh및 를 사용하면 다르게 접근할 수 있습니다 tar.

ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"

그러나 이는 트래픽이 로컬 시스템을 통해 전달됨을 의미합니다.

답변3

먼저 ssh를 사용하여 제거한 다음 scp를 사용하여 다시 만듭니다. 즉, 스크립트 파일에서...

ssh -i ~/.ssh/[private_key] user@server2 "rm -rf dir2; 종료;"

scp -prq 서버1:dir1 서버2:dir2

답변4

나는 정확히 이 동일한 문제에 대해 머리를 부딪쳤고 결국 내가 한 일은 세미 펀팅이었습니다. dir2가 이면 dir1의 [STUFF]/parent/child2이름을 바꾸거나 상황에 따라 dir1을 server1의 dir1_child2로 복사하거나 연결하여 마지막 경로가 구성 요소도 다음과 같습니다 child2. 그런 다음 실행하십시오.

scp -prq server1:dir1_child2 server2:[STUFF]/parent

이것은 dir2의 상위 디렉토리에 child2가 있는지 여부에 관계없이 실행되며, 있는 경우 dir2를 행복하게 대체합니다.

관련 정보