성공적인 최종 복사 후 SSH를 통해 파일 이동 및 소스 삭제


1

SSH 연결을 통해 원격 호스트로 전송 해야하는 총 크기가 약 300GB 인 ~ 200 000 개의 파일 폴더가 있습니다. 로컬 파일이 원격 호스트에 성공적으로 복사되었음을 확인한 후 로컬 파일을 삭제하는 방법을 찾고 있지만 어떻게해야하는지 알 수 없습니다. rsync --remove-source-files다른 게시물 ( here ) 에 따라 연결이 끊어지면 안전하지 않은 것 같습니다 . 어떻게 안전하게 할 수 있습니까?


무엇에 대해 rsync $arguments && rm -r $folder? 그것은 호출해야 rsync하며 rmif rsync종료가 성공적으로 실행 되어야합니다 .
Blacklight Shining

각 개별 파일 (또는 적은 수의 파일)을 복사 한 후 전송 중에 파일을 제거해야합니다. (이것은 단순히 로컬 드라이브에 공간이 필요하고 내가 복사하는 연결이 성가 시게 느리기 때문입니다.)
Morgan

파일을 하위 디렉토리로 분할 한 다음 rsync한 번에 하나의 하위 디렉토리로 분할하여 업로드시 파일을 제거 할 수 있습니까? (솔루션을 자동화해야합니까, 아니면 컴퓨터를 항상 사용하겠습니까?)
Blacklight Shining

폴더 구조를 유지해야하므로 하위 폴더를 만들 수 없습니다. 자동화하는 것을 선호합니다. 기본적으로 rsync --remove-source-files더 안정적입니다.
Morgan

답변:


1

쉘 스크립트를 사용하십시오 :
아래에 설명 된 몇 가지 가정을합니다.

#!/bin/sh

# first, upload the directory structure
# be REALLY sure that it made it intact!
while true
do
    # try to upload it:
    rsync $flags --filter="+ */" --filter="- *" $source $destination
    # it uploaded fine? cool, break the loop (else try again):
    [ "$?" -eq 0 ] && break
done

# now the files
for file in $(find $source -not -type d)
do
    # again, be REALLY sure they copied okay!
    while true
    do
        # try to upload it:
        rsync $flags $file $destination/$file
        # it uploaded fine? cool, break the innermost loop (else try again):
        [ "$?" -eq 0 ] && break
    done
    # delete the local copy of the file:
    rm $file
done

이 스크립트는 다음을 가정합니다.

  1. $source, $destination$flags중 하나를 환경 변수로 설정하거나 실제 소스, 목적지 및 기타와 스크립트에 대체되었다 rsync당신이 사용하려는 플래그. (교체하지 마십시오 $?또는 $file.)
  2. 그것은 $source상대 경로입니다.
  3. rsync경우 제로가 아닌 상태로 종료됩니다 어떤 이유로 지정된 $file성공적으로 100 % 복사되지 않았습니다.
  4. 내가하지 않았기 때문에 덜 중요한 데이터로 테스트했습니다.

rsync --filter매개 변수에서 복사 된 블로그 게시물 에 의해 필라는 어떤 남자 . 나는 그와 함께 괜찮기를 바랍니다. :)


감사합니다. 스크립트를 이해하면 각 파일에 대해 새 연결이 만들어 지므로 전송 속도가 크게 느려지지 않습니까? 비록 그것이 일을 끝내면 어쨌든 그만한 가치가 있다고 생각합니다. :)
Morgan

rsync각 파일마다 새로운 인스턴스를 사용하여 연결 재사용을 방지합니다. 그래도 파일을 사용 strace하거나 다른 것을 제외하고 파일을 rsync닫을 때 파일을 삭제 하면 업로드가 완료되는 즉시 파일을 삭제하는 다른 방법을 생각할 수 없습니까?
Blacklight Shining

내 스크립트를 Kent의 솔루션과 결합 할 수 있습니다. 모든 파일 목록을 작성하고 하나씩 복사하는 대신 각 파일에 몇 개의 파일이있는 서브 디렉토리 목록을 작성하십시오 (한 번에 업로드 할 파일 수를 판단 할 수 있음). 다시 한 번 덜 중요하게 테스트 해보십시오. 나는 방법을 잘 모르겠어요 rsync foo/bar $server:foo/bar기존과 행동 foo/bar에 디렉토리 서버가 로컬 복사 수도 foo/bar내부 를 제공, 원격 하나 foo/bar/bar와 디렉토리 구조를 파괴!
Blacklight Shining

ssh $server rm -r $destination/$file전화를 걸기 전에 디렉토리 목록에 중복 항목이 없다고 가정하고 빈 폴더를 삭제하면 후자의 문제를 해결할 수 있습니다 rsync. 그러나 더 많은 오버 헤드가 발생합니다. Grrrrr… (비밀번호없는 ssh로그인을 설정 했으면합니다 . 말할 필요도없이, 서버에 여러 번 로그인해야합니다 .)
Blacklight Shining

0

sshfs 를 사용할 수 있습니다 . sshfs를 사용하면 ssh를 통해 원격 디렉토리를 "마운트"할 수 있습니다 (실제로 ssh 이외의 명령을 수행하여 파일 시스템을 모방 함). 그런 다음 mv파일을 이동 하는 데 사용할 수 있습니다 .

사용자 공간 파일 시스템이기 때문에 수퍼 유저 일 필요는 없습니다.


1
mv끊어진 연결 은 어떻게 처리합니까?
Morgan

인가되지 sshfs다소 신뢰할 수없는? 모건이 rsync검증을 원한다고 추측하고 있습니다 (그렇지 않으면 간단한 것만으로 scp -r $folder $host:$folder도 충분합니다). 그런 경우에는 사용하고 싶지 않습니다 sshfs. (대안은 rsyncover sshfs를 사용 sshfs하여 처음부터 사용 목적을
무너 뜨릴

1
소스와 대상이 모두 동일한 파일 시스템에있는 경우 파일에 대한 링크가 수정됩니다. 파일이 다른 파일 시스템에 있으면 파일이 먼저 복사되고 원본 파일의 링크가 제거됩니다. 파일을 복사하기 전에 연결이 끊어지면 부분 파일이있을 수 있지만 원본은 그대로 남아 있습니다.
유타 Jarhead

@Blacklight Shining : 신뢰할 수없는 항목에 따라 다릅니다 (매일 사용). 요점은 연결을 일정 시간 동안 비활성화하면 하나의 엔드 포인트 (클라이언트 또는 서버)가 연결을 닫을 수 있다는 것입니다. sshfs / mv (또는 cp) / fuserumount를 수행하면 연결이 항상 사용되므로 문제가 없습니다. 아침에 sshfs를 수행하고 1 시간 후 연결이 예상 될 경우 연결이 유지되도록 sshd 및 클라이언트가 구성되어 있는지 확인해야합니다.
Victor von Cacahuete

1
안녕 모건 UtahJarhead가 응답 : 파일 전송 중 어떤 이유로 연결이 끊어지면 수신 측에 파일이 부분적으로 전송되고 전송 측에 파일이 그대로 유지됩니다 (송신 측의 파일은 전송 후에 만 ​​삭제되므로).
Victor von Cacahuete

0

예를 들어 파일을 10 개의 블록으로 분할 한 다음

rsync (source files) destination

그리고 성공적으로 실행되면

rsync --remove-source-files (source files) destination

두 번째 rsync 명령의 추가 대역폭은 무시할 수 있습니다.


rsync다시 실행할 필요가 없습니다 . 첫 번째 호출에서 파일이 모두 같은지 확인하기 위해 시간을 낭비하는 것입니다. 후 rsync, 당신은 할 수 있습니다 rm -r $source_files.
Blacklight Shining

도! 좋은 지적. rsync행복감에 사로 잡혔습니다 . 두 번째 rsync가 첫 번째 rsync의 작업을 확인한다는 점에서 약간 더 큰 보안 감각을 제공 할 수 있습니다 ... 그러나 나는 그것이 최소한으로 생각합니다.
Kent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.