Bash + rclone · OneDrive ↔ Google Drive · راهنمای عملیاتی متن‌باز

انتقال ابری صرفاً برای کپی با Bash و rclone

rclone از قبل صفحه‌بندی فضای ابری، تلاش‌های مجدد، انتقال‌های قابل ازسرگیری و هش‌های ارائه‌دهندگان را می‌شناسد. وظیفهٔ مهندسی این است که این قابلیت‌های پایه در یک رویهٔ عملیاتی آگاه از ظرفیت و با توقف ایمن در صورت خطا قرار گیرند.

به‌روزرسانی‌شده ; 20 دقیقه زمان مطالعه.

پاسخ کوتاه

FileArk برای مهاجرت‌های بزرگ یا بدون نظارت، گزینهٔ مدیریت‌شده و ساده‌تری است: انتقال را آنلاین اجرا می‌کند، با بارهای کاری چندترابایتی آزمایش شده است و هر نتیجه را پیش از تکمیل بررسی می‌کند. برای اپراتورهایی که مسیر دادهٔ تحت کنترل پوسته می‌خواهند، این اسکریپت پوششی Bash با مجوز MIT دسته‌هایی با اندازهٔ محدود را از طریق مرحله‌بندی محلی کپی می‌کند، هر دو مرحله را بایت‌به‌بایت راستی‌آزمایی می‌کند و هرگز فایل‌های مبدأ را حذف نمی‌کند.

چرا به‌جای بازسازی کلاینت هر ارائه‌دهنده، 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 · متن ساده

دموی اجرایی بدون شبکه را اجرا کنید

ترمینال در حال اجرای اسکریپت انتقال ابری Bash و rclone متعلق به FileArk در حالت نمایشی
این دمو عبور یک بسته با اندازهٔ محدود از هر دو مرز راستی‌آزمایی را نشان می‌دهد. پیکربندی 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 نیاز دارند، شناسه و رمز کلاینت ارائه‌دهندهٔ خود را وارد کنید. 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

پیش از جابه‌جایی بایت‌ها، یک فهرست قطعی تثبیت کنید

اسکریپت پوششی، rclone lsf را به‌صورت بازگشتی و با جداکنندهٔ صریح تب و قالب sp اجرا می‌کند تا ابتدا اندازه و سپس مسیر تولید شود. این اسکریپت عددی‌بودن هر اندازه و نسبی‌بودن هر مسیر را اعتبارسنجی می‌کند، سپس مسیرهای از قبل موجود در نقطهٔ بررسی تأییدشده را کنار می‌گذارد.

نسخهٔ 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 از دیسک محلی دست‌نخورده می‌ماند، 10 GiB فضای خالی در Google Drive حفظ می‌شود، سقف یک دستهٔ عادی 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، آرگومان‌های راه‌دور را جابه‌جا کنید و برای آن اجرا یک پوشهٔ مقصد، مسیر مرحله‌بندی و فایل نقطهٔ بررسی جدید تعیین کنید.

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، اثرانگشت پیکربندی، فهرست، گزارش‌ها، برچسب‌های زمانی و یادداشت‌های پذیرش نگه دارید. برای نادیده‌گرفتن یک شکست، آن را ویرایش نکنید؛ مگر اینکه فایل مقصد به‌طور مستقل راستی‌آزمایی شده باشد.

یک نقطهٔ بررسی ساده بر پایهٔ مسیر نمی‌تواند شیء مبدأیی را تشخیص دهد که محتوایش بدون تغییر مسیر عوض شده است. برای مجموعه‌داده‌های تغییرپذیر، نوشتن را موقتاً متوقف کنید، شناسه‌های ارائه‌دهنده و فراداده‌های تغییر را جداگانه ثبت کنید، یا از نقطهٔ بررسی سخت‌گیرانه‌ترِ مبتنی بر شناسه و اندازه در نسخهٔ Python استفاده کنید. برای انتقال‌های مشمول مقررات یا مشارکتی، از یک گردش کار مدیریت‌شده با کنترل صریح تغییرات استفاده کنید.

هر خروج با کد غیرصفر را یک دستهٔ حل‌نشده در نظر بگیرید

  • حالت سخت‌گیرانه هنگام شکست یک فرمان، خط لوله یا متغیر تنظیم‌نشده از اجرا خارج می‌شود؛ پوشهٔ موقت فهرست نیز به‌طور خودکار حذف می‌شود.
  • rclone انتقال‌هایی را که با خطاهای موقت روبه‌رو شده‌اند دوباره امتحان می‌کند؛ اما خطاهای پایدار مربوط به مجوز، سهمیه، شبکه، تعارض یا یکپارچگی، دسته را متوقف می‌کنند.
  • فایل‌های مرحله‌بندی‌شده‌ای که در نقطهٔ بررسی ثبت نشده‌اند برای بازرسی باقی می‌مانند و اجرای مجدد کاملاً یکسان، پیش از بررسی بایت‌های آن‌ها از --ignore-existing استفاده می‌کند.
  • فایل متفاوتی که در مقصد وجود دارد هرگز بازنویسی نمی‌شود. تعارض را برطرف کنید یا یک ریشهٔ مقصد خالی برگزینید.
  • یک کپی ناموفق را به rclone sync یا move تبدیل نکنید. این فرمان‌ها منطق متفاوتی برای حذف دارند.
  • گزارش‌ها و نقطهٔ بررسی را تا پایان پذیرش دستی مقصد نگه دارید.

میزبانی را که به صفحهٔ داده تبدیل می‌شود ایمن کنید

میزبان مرحله‌بندی به‌طور موقت حاوی نسخه‌های خواندنی داده‌های مبدأ و توکن‌های نوسازی OAuth است. از رمزگذاری کامل دیسک، مجوزهای محدودکنندهٔ فایل، یک حساب اختصاصی سیستم‌عامل، وابستگی‌های وصله‌شده، دسترسی کنترل‌شدهٔ مدیر و سیاست پشتیبان‌گیری رمزگذاری‌شده‌ای استفاده کنید که محتوای مرحله‌بندی را به‌طور ناخواسته نگه نمی‌دارد.

از درج اطلاعات محرمانه در خط فرمان خودداری کنید، زیرا فهرست فرایندها و تاریخچهٔ پوسته می‌توانند آن‌ها را افشا کنند. پیکربندی محافظت‌شدهٔ rclone می‌تواند توکن‌های ذخیره‌شده را مبهم کند، اما جایگزین امنیت میزبان نیست. پس از پذیرش مهاجرت، داده‌های مربوط به توکن و بقایای مرحله‌بندی را مطابق سیاست نگهداشت خود حذف کنید.

گزارش‌های ممیزی ارائه‌دهنده، ترافیک خروجی شبکه، سلامت دیسک، موجودی inode، وضعیت فرایند و خروجی rclone را پایش کنید. بازگذاشتن یک ترمینال به معنای نظارت بر فرایند نیست؛ از مدیر سرویس یا چندبرابرکنندهٔ ترمینال مورد تأیید استفاده کنید و گزارش‌ها را به‌صورت پایدار نگه دارید.

مهاجرت را با شواهد نهایی کنید، نه صرفاً یک فرمان موفق

  • فهرست تثبیت‌شده، فرمان دقیق، جمع کنترلی اسکریپت، نسخهٔ rclone، اثرانگشت پیکربندی راه‌دورها و نقطهٔ بررسی تأییدشده را بایگانی کنید.
  • تعداد فایل‌ها و بایت‌های مشخص را برای هر پوشه تطبیق دهید، نه فقط برای مجموع درایو.
  • نمونه‌ای مبتنی بر ریسک از اسناد بزرگ، کوچک، قدیمی، جدید، دارای نویسه‌های Unicode، با تو‌در‌تویی عمیق، بایگانی‌شده و تبدیل‌شده را باز کنید.
  • دسترسی به مقصد را از حساب‌های کاربری نمونه آزمایش کنید و اشتراک‌گذاری‌های لازم را جداگانه از نو بسازید.
  • بسته‌های نادیده‌گرفته‌شده، میان‌برها، پیوندها، اسناد بومی، تعارض‌ها و هشدارهای ارائه‌دهنده را بررسی کنید.
  • یک دورهٔ هم‌پوشانی برای مبدأ در نظر بگیرید و پیش از هر تصمیم بعدی دربارهٔ نگهداری یا حذف، تأیید صریح مالک را دریافت کنید.

پرسش‌های متداول

چرا اسکریپت Bash به‌جای sync از rclone copy استفاده می‌کند؟

کپی نه اشیای مبدأ را حذف می‌کند و نه اشیای موجود در مقصد را که در مبدأ وجود ندارند. همگام‌سازی منطق متفاوتی برای تطبیق و حذف دارد؛ بنابراین عمداً خارج از این گردش‌کار است.

آیا rclone check --download تغییری در یکی از فضاهای ابری ایجاد می‌کند؟

خیر. محتوای فایل را می‌خواند و مقایسه می‌کند. اسکریپت پس از هر مرحلهٔ کپی از آن استفاده می‌کند تا یک مسیر فقط زمانی در نقطهٔ بررسی ثبت شود که بایت‌های مقصد با بایت‌های مرحله‌بندی‌شده مطابقت داشته باشند.

اگر مقصد از قبل دارای یک فایل باشد چه اتفاقی می‌افتد؟

کپی از --ignore-existing و سپس راستی‌آزمایی کامل بایت‌ها استفاده می‌کند. یک شیء یکسان می‌تواند تأیید شود؛ اما شیء متفاوت باعث شکست بررسی می‌شود. اسکریپت هرگز فایل دارای تعارض را بازنویسی نمی‌کند.

آیا اسکریپت می‌تواند فایل‌های بزرگ‌تر از یک دسته را مدیریت کند؟

بله. یک فایل بیش‌ازحد بزرگ به بسته‌ای جداگانه تبدیل می‌شود. سامانهٔ فایل مرحله‌بندی باید برای آن فایل و فضای ذخیرهٔ محلی پیکربندی‌شده جا داشته باشد.

آیا این روش مجوزها، نسخه‌ها یا داده‌های همکاری بومی فضای ابری را منتقل می‌کند؟

خیر. این روش محتوای فایل و مسیرها را از طریق rclone کپی می‌کند. کنترل دسترسی، نسخه‌ها، برچسب‌ها، نظرها، میان‌برها، پیوندها، قواعد نگهداری و رفتار بومی ارائه‌دهنده به برنامه‌ریزی و راستی‌آزمایی جداگانه نیاز دارند.

منابع رسمی استفاده‌شده در این راهنما

مطالعه راهنما