Bash + rclone · OneDrive ↔ Google Drive · 오픈 소스 운영 가이드

Bash와 rclone을 이용한 복사 전용 클라우드 전송

rclone은 이미 클라우드 페이지네이션, 재시도, 재개 가능한 전송, 공급자 해시를 처리할 수 있습니다. 엔지니어링 과제는 이러한 기본 기능을 오류 시 중단되고 용량을 고려하는 운영 절차로 감싸는 것입니다.

업데이트 ; 20 분 소요.

간단한 답변

FileArk는 대규모 또는 무인 마이그레이션을 위한 더 간편한 관리형 옵션입니다. 온라인으로 전송을 실행하고, 수 테라바이트 규모의 작업을 대상으로 테스트되었으며, 완료 전에 각 결과를 확인합니다. 셸로 데이터 경로를 제어하려는 운영자를 위해 이 MIT 라이선스 Bash 래퍼는 로컬 스테이징을 통해 제한된 크기의 배치를 복사하고, 두 전송 구간을 바이트 단위로 검증하며, 소스 파일을 절대 삭제하지 않습니다.

모든 공급자 클라이언트를 다시 구축하지 않고 rclone을 래핑하는 이유

rclone은 셸 워크플로에 성숙한 공급자 추상화, OAuth 구성, 페이지네이션, 재시도 동작, 재개 가능한 전송, 동시 실행 제어, 인벤토리 명령, 검증 명령을 제공합니다. 따라서 래퍼는 복사 전용 명령, 제한된 스테이징, 용량 예비분, 확정적 파일 목록, 영구적인 진행 기록과 같은 마이그레이션 불변 조건에 집중할 수 있습니다.

그렇다고 작업이 자동화되는 것은 아닙니다. 운영자는 여전히 원격 구성, 토큰 보안, 네트워크 가동 시간, 프로세스 감독, 로컬 디스크, 로그, 공급자 제한, 실패한 객체 검토, 대상 승인을 책임져야 합니다. FileArk는 이 절차를 워크스테이션이나 서버가 아닌 관리형 온라인 워크플로로 운영하려는 사용자를 위한 서비스입니다.

스크립트는 rclone move, sync, delete, purge 또는 rmdirs를 절대 호출하지 않습니다. 탐색에는 lsf와 about을, 각 구간의 전송에는 copy를, 전체 바이트 검증에는 check --download를 사용합니다. 삭제되는 것은 검증을 마친 로컬 스테이징 디렉터리의 파일뿐입니다.

Bash 버전과 MIT 라이선스 다운로드

Bash 및 rclone 전송 프로그램 다운로드
배치 한도, 로컬 및 대상 예비 공간, 전체 바이트 검증, 체크포인트, 재시도 제어, 네트워크가 필요 없는 데모를 갖춘 복사 전용 래퍼입니다.
fileark-cloud-transfer.sh · Bash 4 이상 · rclone · jq · MIT 라이선스

MIT 라이선스 다운로드
FileArk 수동 전송 스크립트 두 개에 모두 적용되는 사용 허가 고지입니다.
LICENSE-fileark-cloud-transfer.txt · MIT · 일반 텍스트

네트워크 연결 없이 운영자 데모 실행하기

데모 모드로 FileArk Bash 및 rclone 클라우드 전송 스크립트를 실행하는 터미널
이 데모는 크기가 제한된 단일 배치가 두 검증 경계를 모두 통과하는 과정을 보여줍니다. rclone 구성을 검사하거나 클라우드에 연결하거나 원격 데이터를 기록하지는 않습니다.

데모는 인수 구문 분석 단계에서 종속성 확인 전에 종료되므로 rclone이나 jq를 설치하기 전에도 안전하게 실행할 수 있습니다. 출력에는 금지된 파괴적 작업과 두 가지 용량 예비분이 표시되며, 마지막에는 소스 삭제 횟수가 나옵니다.

다운로드 검사 및 스모크 테스트
chmod +x fileark-cloud-transfer.sh
bash -n fileark-cloud-transfer.sh
./fileark-cloud-transfer.sh --demo
./fileark-cloud-transfer.sh --help

운영에 필요한 종속 항목 설치 및 구성하기

공식 안내에 따라 최신 rclone 릴리스를 설치하고, 운영 체제의 패키지 관리자를 통해 jq를 설치하세요. 이 래퍼는 엄격한 오류 처리와 최신 조건식을 사용하므로 Bash 4 이상이 필요합니다.

rclone config를 실행하고 onedrive:와 gdrive:처럼 서로 다른 이름의 원격 저장소 두 개를 만드세요. 정책이나 속도 제한 때문에 전용 OAuth 애플리케이션이 필요하다면 자체 공급자 클라이언트 ID와 비밀 키를 입력하세요. rclone은 OAuth 토큰을 구성 파일에 저장합니다. 제한적인 권한으로 이 파일을 보호하고 스크립트와 함께 배포하지 마세요.

래퍼를 실행하기 전에 읽기 전용 목록 명령과 할당량 명령으로 각 원격 저장소를 확인하세요. 특정 하위 트리만 대상이라면 onedrive:Department/Archive와 같은 경로를 사용하세요.

두 원격 저장소 구성 및 점검
rclone version
rclone config
rclone lsd onedrive:
rclone lsd gdrive:
rclone about onedrive: --json | jq
rclone about gdrive: --json | jq

바이트를 이동하기 전에 확정적 인벤토리 고정하기

래퍼는 명시적인 탭 구분자와 sp 형식을 사용해 rclone lsf를 재귀적으로 실행하며, 크기와 경로가 차례로 나오는 결과를 생성합니다. 각 크기가 숫자이고 각 경로가 상대 경로인지 검증한 다음, 검증된 체크포인트에 이미 있는 경로를 제외합니다.

Bash 버전은 탭, 캐리지 리턴 또는 줄바꿈이 포함된 파일 이름을 거부합니다. 줄바꿈으로 구분되는 --files-from-raw 목록에서는 이러한 이름을 모호함 없이 표현할 수 없기 때문입니다. 이런 이름이 있다면 Python 버전이나 해당 용도에 맞게 설계된 인벤토리 형식을 사용하세요.

경로 체크포인트는 의도적으로 단순하고 검사하기 쉽게 설계되었습니다. 실행 중 소스 경로가 그대로 유지된다는 전제하에 작동합니다. 가능하면 소스에 대한 쓰기를 중지하세요. 동시 변경이 예상된다면 인벤토리를 다시 생성하고 대조하세요.

래퍼에서 사용하는 인벤토리 기본 명령
rclone lsf "$SOURCE" \
  --recursive \
  --files-only \
  --format "sp" \
  --separator 
    
  

\t' > "$inventory"

배치가 예비 공간을 사용하기 전에 중단하기

로컬 여유 바이트는 스테이징 파일 시스템에서 실행한 df를 통해 확인합니다. 대상 여유 바이트는 rclone about --json에서 가져옵니다. free가 제공되면 그 값을 사용하고, 그렇지 않으면 total에서 used를 뺍니다. 스크립트는 작업 전에 대기 중인 전체 바이트를 확인하고, 각 배치를 시작하기 전에도 로컬과 대상의 용량을 다시 확인합니다.

일부 공급자나 계정 유형은 rclone을 통해 유한한 할당량을 제공하지 않습니다. 래퍼는 이 제한 사항을 표시한 후 공급자의 제한 적용에 따라 계속 진행합니다. 이를 충분한 공간이 있다는 증거가 아니라 모니터링이 필요하다는 의미로 받아들이세요.

배치 한도는 개별 객체에 적용되는 절대적인 최대 크기가 아닙니다. 구성된 배치 크기보다 큰 단일 파일은 그 자체로 하나의 배치를 구성할 수 있으므로, 로컬 여유 공간은 가장 큰 파일의 크기와 예비분을 합한 만큼 확보해야 합니다. 전체 대상 검증은 대상에서 바이트를 읽지만, rclone 버전에서는 두 번째 로컬 사본을 보관하지 않습니다.

로컬 스테이징 경계의 양쪽 검증하기

각 배치는 서로 독립적인 두 구간을 거칩니다. 먼저 rclone은 --ignore-existing을 사용해 선택된 소스 경로를 로컬 스테이징에 복사한 다음, check --download로 양쪽을 읽고 실제 콘텐츠를 비교합니다. 이어서 rclone은 스테이징된 경로를 대상에 복사하고 동일한 전체 바이트 검사를 반복합니다.

--ignore-existing을 사용하면 중단된 실행에서도 기존 객체를 덮어쓰지 않으므로 데이터가 손상되지 않습니다. 경로를 체크포인트에 기록하려면 먼저 검증을 통과해야 합니다. 기존 대상이 다르면 rclone check가 실패하고 Bash의 엄격한 오류 처리에 따라 실행이 중단됩니다.

--download를 사용하면 속도가 느려지고 공급자의 데이터 반출 및 읽기 작업이 발생하지만, 두 공급자가 공통 해시 알고리즘을 제공하는지 여부에만 의존하지 않아도 됩니다. 이 명령은 어느 쪽도 변경하지 않습니다.

두 복사 및 검증 구간
rclone copy "$SOURCE" "$STAGING_DIR" \
  --files-from-raw "$batch_list" \
  --ignore-existing --retries 6 --low-level-retries 20

rclone check "$SOURCE" "$STAGING_DIR" \
  --files-from-raw "$batch_list" --one-way --download

rclone copy "$STAGING_DIR" "$DESTINATION_ROOT" \
  --files-from-raw "$batch_list" \
  --ignore-existing --retries 6 --low-level-retries 20

rclone check "$STAGING_DIR" "$DESTINATION_ROOT" \
  --files-from-raw "$batch_list" --one-way --download

제한된 스테이징 공간으로 OneDrive에서 Google Drive로 전송하기

이 예시는 로컬 디스크에서 15 GiB를 예비 공간으로 유지하고, Google Drive에서 10 GiB의 여유 공간을 확보하며, 일반 배치를 8 GiB 또는 200개 파일로 제한하고, 네 개의 동시 전송을 사용합니다. 대상 콘텐츠는 날짜가 포함된 새 폴더 아래에 기록됩니다.

먼저 --dry-run을 사용하세요. 다운로드나 업로드 없이 원본 인벤토리를 생성하고 대상 할당량을 사전 점검합니다. 래퍼는 대기 중인 모든 데이터의 바이트 수를 표시하며, 첫 번째 실제 배치를 실행하기 전에 이를 이전 범위와 대조해야 합니다.

사전 점검 후 같은 범위 실행
./fileark-cloud-transfer.sh \
  --source onedrive: \
  --destination gdrive: \
  --destination-folder "OneDrive archive 2026-07-25" \
  --staging-dir /srv/fileark-staging \
  --state-file ./onedrive-to-google-verified.txt \
  --batch-gib 8 \
  --batch-files 200 \
  --local-reserve-gib 15 \
  --destination-reserve-gib 10 \
  --transfers 4 \
  --checkers 8 \
  --dry-run

# Remove only --dry-run after reviewing the preflight.

상태를 재사용하지 않고 전송 방향 바꾸기

원격 어댑터는 rclone이 담당하므로 이 래퍼는 공급자에 종속되지 않습니다. 원격 인수를 서로 바꾸면 Google Drive를 OneDrive로 복사할 수 있으며, 이 실행에는 새로운 대상 폴더, 스테이징 경로, 체크포인트 파일을 지정해야 합니다.

Google Docs, Sheets, Slides 및 기타 Google 기본 가상 형식에는 rclone 내보내기 설정과 세심한 검토가 필요합니다. 테스트 세트로 내보낸 파일의 확장자와 변환 방식을 확인하세요. 셸 복사로는 Google의 공동작업 기록, 바로가기, 권한 또는 Microsoft 전용 메타데이터가 보존되지 않습니다.

Google Drive에서 OneDrive로
./fileark-cloud-transfer.sh \
  --source gdrive: \
  --destination onedrive: \
  --destination-folder "Google archive 2026-07-25" \
  --staging-dir /srv/google-staging \
  --state-file ./google-to-onedrive-verified.txt \
  --batch-gib 8 \
  --local-reserve-gib 15

대상 검증 후에만 체크포인트 기록하기

대상 검사가 성공적으로 종료되면 래퍼는 각 상대 경로를 일반 텍스트 체크포인트에 추가합니다. 그런 다음 로컬 스테이징에서 해당 파일을 삭제하고 비어 있는 로컬 디렉터리를 제거합니다. 소스 원격 저장소는 변경되지 않습니다.

체크포인트는 실행 중 추가만 가능하며 표준 도구로 쉽게 감사할 수 있습니다. 명령줄, rclone 버전, 구성 지문, 인벤토리, 로그, 타임스탬프, 승인 메모와 함께 보관하세요. 대상 파일을 별도로 검증한 경우가 아니라면 실패를 숨기기 위해 체크포인트를 편집하지 마세요.

경로만 기록하는 체크포인트로는 경로가 그대로인 채 콘텐츠가 변경된 원본 객체를 감지할 수 없습니다. 변경 가능한 데이터 세트의 경우 쓰기 작업을 일시 중지하고 공급자 ID와 수정 메타데이터를 별도로 기록하거나, Python 버전의 더 엄격한 ID 및 크기 기반 체크포인트를 사용하세요. 규제 대상이거나 공동작업이 이루어지는 데이터의 이전에는 명시적인 변경 제어를 제공하는 관리형 워크플로를 사용하세요.

0이 아닌 모든 종료 코드를 미해결 배치로 처리하기

  • 엄격 모드에서는 명령이나 파이프라인이 실패하거나 설정되지 않은 변수가 사용되면 종료되며, 임시 인벤토리 디렉터리는 자동으로 삭제됩니다.
  • rclone은 일시적인 전송 오류를 재시도하지만, 지속적인 권한, 할당량, 네트워크, 충돌 또는 무결성 오류가 발생하면 배치를 중단합니다.
  • 체크포인트에 기록되지 않은 스테이징 파일은 검사할 수 있도록 그대로 유지되며, 동일하게 다시 실행하면 바이트를 검사하기 전에 --ignore-existing을 사용합니다.
  • 내용이 다른 대상 파일은 절대 덮어쓰지 않습니다. 충돌을 해결하거나 비어 있는 대상 루트를 선택하세요.
  • 실패한 복사 작업을 rclone sync나 move로 바꾸지 마세요. 이러한 명령은 삭제 의미 체계가 다릅니다.
  • 대상에 대한 수동 승인이 완료될 때까지 로그와 체크포인트를 보관하세요.

데이터 플레인이 되는 호스트 보호하기

스테이징 호스트에는 읽을 수 있는 원본 데이터 사본과 OAuth 갱신 토큰이 일시적으로 저장됩니다. 전체 디스크 암호화, 제한적인 파일 권한, 전용 운영 체제 계정, 보안 패치가 적용된 종속 항목, 통제된 관리자 접근 권한을 사용하세요. 또한 스테이징 콘텐츠가 예기치 않게 보존되지 않도록 암호화된 백업 정책을 적용하세요.

프로세스 목록과 셸 기록을 통해 노출될 수 있으므로 명령줄에 비밀 정보를 입력하지 마세요. rclone의 보호된 구성은 저장 상태의 토큰을 알아보기 어렵게 만들 수 있지만 호스트 보안을 대신하지는 못합니다. 마이그레이션 승인 후 보존 정책에 따라 토큰 자료와 남아 있는 스테이징 데이터를 삭제하세요.

공급자 감사 로그, 네트워크 송신 트래픽, 디스크 상태, inode 가용성, 프로세스 상태, rclone 출력을 모니터링하세요. 터미널을 열어 두는 것만으로는 프로세스를 감독할 수 없습니다. 승인된 서비스 관리자나 터미널 멀티플렉서를 사용하고 로그가 영구 보존되도록 하세요.

명령의 성공 표시가 아닌 증거로 마이그레이션 마무리하기

  • 고정된 인벤토리, 정확한 명령, 스크립트 체크섬, rclone 버전, 원격 구성 지문, 검증된 체크포인트를 보관하세요.
  • 드라이브 전체 합계뿐 아니라 폴더별로 파일 수와 확인된 바이트 수를 대조하세요.
  • 위험을 기준으로 크거나 작은 문서, 오래되거나 새로운 문서, Unicode 문서, 깊이 중첩된 문서, 보관된 문서, 변환된 문서의 표본을 열어 확인하세요.
  • 대표 사용자 계정으로 대상에 대한 접근을 테스트하고 필요한 공유 설정을 별도로 다시 만드세요.
  • 건너뛴 패키지, 바로 가기, 링크, 공급자 고유 문서, 충돌, 공급자 경고를 검토하세요.
  • 원본을 함께 유지하는 기간을 두고, 이후 보존 또는 삭제 결정을 내리기 전에 소유자의 명시적인 승인을 받으세요.

자주 묻는 질문

Bash 스크립트에서 sync 대신 rclone copy를 사용하는 이유는 무엇인가요?

복사는 소스 객체를 삭제하지 않으며, 소스에 없는 대상 객체도 제거하지 않습니다. 동기화에는 다른 조정 및 삭제 의미 체계가 있으므로 의도적으로 이 워크플로에서 제외했습니다.

rclone check --download는 어느 쪽 클라우드라도 변경하나요?

아니요. 파일 콘텐츠를 읽고 비교합니다. 스크립트는 각 복사 구간이 끝난 후 이를 사용하므로, 대상의 바이트가 스테이징된 바이트와 일치할 때만 해당 경로가 체크포인트에 기록됩니다.

대상에 이미 파일이 있으면 어떻게 되나요?

복사에는 --ignore-existing을 사용한 후 전체 바이트 검증을 수행합니다. 동일한 객체라면 검증을 통과할 수 있지만, 다른 객체라면 실패합니다. 스크립트는 충돌한 파일을 절대 덮어쓰지 않습니다.

스크립트가 배치 한도보다 큰 파일도 처리할 수 있나요?

예. 크기가 제한을 초과하는 파일 하나는 별도의 배치로 처리됩니다. 스테이징 파일 시스템에는 해당 파일과 설정된 로컬 예비 공간을 수용할 여유 공간이 있어야 합니다.

권한, 버전 또는 클라우드 네이티브 공동작업 데이터도 이전되나요?

아니요. rclone을 통해 파일 콘텐츠와 경로를 복사합니다. 접근 제어, 버전, 레이블, 댓글, 바로가기, 링크, 보존 규칙 및 공급자 고유 동작은 별도로 계획하고 검증해야 합니다.

이 가이드에 사용된 공식 자료

가이드 읽기