Quy tắc chuyển Google Drive đầy dung lượng giữa 2 tài khoản

Screenshot Google Drive: Out of storage, Emails will stop on Sep 6, 2026, 117.01 GB of 15 GB used
Mục lục

Tài khoản Google Pro của mình hết hạn. Mình không gia hạn. Dung lượng sắp rớt về gói free. 117.01GB đang dùng. Hạn free chỉ 15GB. Google báo email ngừng nhận từ 6/9/2026 nếu không trả tiền tiếp.

Mình còn một tài khoản khác, nhiều dung lượng hơn. Chọn chuyển, không trả thêm tiền, không xoá bớt.

Hỏi bạn mình, Tony (Claude Code expert), hướng làm. Câu trả lời gọn gàng: trong nhà Google thì cài gws CLI. Giao agent viết script. Kèm vài lưu ý. Ba lưu ý đó là ba mục lớn bên dưới: ưu tiên file nặng và cũ nhất, tự migrate quyền truy cập kèm shortcut trỏ về, không đụng Sheets/Docs/Slides.

Đây cũng là cách tụi mình hay trao đổi về vấn đề kĩ thuật: hỏi và trả lời nhanh bằng nguyên tắc, không đi sâu vào cách làm, định hướng bằng từ khoá.

Việc, nói gọn: chuyển file Drive từ tài khoản A sang tài khoản B vì A hết chỗ. Giữ link chia sẻ cũ. Giải phóng dung lượng thật, không phải chỉ chuyển chỗ. Đọc xong làm được ngay, không cần hỏi lại từng bước.

Đăng nhập 2 tài khoản Google

Hai tài khoản. Hai chỗ lưu token đăng nhập riêng. Không dùng chung một chỗ.

Đăng nhập xong, kiểm tra ngay. Xem đúng email tài khoản chưa rồi mới đi tiếp. Lệnh chạy không báo lỗi không có nghĩa là đăng nhập đúng.

Đăng nhập được không có nghĩa là gọi được Drive API. Tài khoản thứ hai gần như luôn cần thêm quyền. Thêm vào Test User trên màn hình OAuth consent (GCP Console, mục APIs & Services). Hoặc cấp role roles/serviceusage.serviceUsageConsumer trên project GCP đang dùng. Đọc kỹ thông báo lỗi. Google thường chỉ luôn link console hay tên role cần cấp.

Trình duyệt nhớ tài khoản cũ. Mở màn hình xin quyền, nó tự chọn tài khoản đó, không hỏi lại. Phải tự chọn “dùng tài khoản khác”, hoặc mở cửa sổ ẩn danh.

Chỗ lưu token mới tạo chưa có OAuth client riêng. Dùng lại client_secret.json đã có sẵn, một OAuth client dùng được cho nhiều tài khoản. Không cần tạo OAuth client mới cho mỗi cặp tài khoản.

Chọn file nào cần chuyển

Chỉ chuyển file do tài khoản nguồn sở hữu ('me' in owners). File người khác chia sẻ vào Drive của mình không tính vào dung lượng của mình, để yên.

Bỏ qua file gốc của Google Workspace, không tải nguyên bản được: Docs, Sheets, Slides. Forms, Drawings, Sites cũng vậy nếu gặp. Cộng thêm thư mục và shortcut. Không ép chuyển. Ghi chú lại là bỏ qua.

Cú pháp tìm kiếm q của Drive API không lọc được theo dung lượng file. Lấy hết thông tin file về bằng files.list, tự lọc và sắp xếp bằng code.

Ưu tiên chuyển theo đúng thứ tự được giao: nặng trước, cũ trước, hay gì cũng được. Không tự chế thêm tiêu chí khác.

Chuyển từng file

So md5Checksum giữa file gốc và file mới upload trước. Khớp mới đi tiếp. Không khớp thì dừng lại, không đụng vào file gốc.

Share lại quyền truy cập. Lấy permissions.list từ file gốc. Gọi permissions.create cho file mới. Tắt sendNotificationEmail, khỏi spam email người được chia sẻ. Quyền owner cũ chuyển thành writer trên file mới. Chuyển quyền sở hữu thật là việc khác hẳn (transferOwnership: true). Chỉ dùng khi mục đích là chuyển quyền sở hữu, không phải copy file.

Xong hai bước trên mới đưa file gốc vào thùng rác. Gọi files.update với trashed: true. Không gọi files.delete (xoá vĩnh viễn), trừ khi được yêu cầu rõ ràng bỏ qua thùng rác.

Cần giữ đường link cũ hoạt động thì tạo một Drive shortcut (mimeType: application/vnd.google-apps.shortcut, shortcutDetails.targetId là id file mới), cùng tên, đặt trong thư mục cha của file gốc. Việc này chạy bằng tài khoản nguồn, dùng id thư mục cha bên tài khoản nguồn, không phải thư mục bên tài khoản đích.

Vấn đề kỹ thuật riêng của Drive API

Lệnh đụng tới nội dung file (files.get?alt=media để tải, upload qua files.create/files.update) có thể chạy hàng giờ. File lớn, mạng chậm, cứ vậy. Đặt timeout tính bằng giờ cho các lệnh này. Lệnh lấy metadata (list, get không kèm alt=media, permissions.*) thì giữ timeout ngắn bình thường.

Lưu trạng thái từng file ra một chỗ riêng, theo id file trên Drive: đã xong, hay lỗi. Chạy lại thì đọc chỗ này trước, bỏ qua việc đã xong. Việc chuyển Drive lớn gần như chắc chắn sẽ đứt giữa chừng, cứ giả định vậy.

Thử chuyển một file nhỏ trước. Biết công cụ giới hạn gì (đường dẫn file local, dung lượng upload tối đa) rồi mới chạy hàng loạt.

Tải file có content-type là application/json trên Drive dễ bị công cụ HTTP tự ý parse thành JSON thay vì ghi ra byte thô cho lệnh alt=media. Kiểm tra kỹ output byte thật với loại file JSON, đừng giả định mọi mimeType đều tải giống nhau.

Theo dõi một lượt chuyển file chạy lâu: im lặng không có nghĩa là nó chết. Upload, chia sẻ quyền, đưa vào thùng rác, tạo shortcut, không bước nào đụng ổ đĩa local. Xem CPU có tăng không. Xem còn tiến trình con đang chạy không. Rồi mới kết luận nó treo.

Bước hay bị quên nhất: thùng rác vẫn tính vào quota

File vào thùng rác trên Drive vẫn tính vào storageQuota.usage cho tới khi gọi files.emptyTrash hoặc Google tự xoá sau khoảng 30 ngày. “Đã chuyển sang tài khoản kia” và “đã giải phóng dung lượng tài khoản nguồn” là hai việc khác nhau. Đừng báo việc thứ hai khi chưa kiểm tra lại số liệu.

files.emptyTrash là xoá vĩnh viễn, hết luôn 30 ngày khôi phục. Hỏi xác nhận trước khi gọi, và đối chiếu danh sách file trong thùng rác (q: "trashed=true", so số lượng, tên file) với danh sách vừa chuyển trước khi xoá hẳn.

Sau khi gọi emptyTrash (hay bất kỳ thao tác xoá hàng loạt nào), gọi lại about.get(fields="storageQuota") để chắc chắn usage đã giảm. Đừng giả định lệnh chạy thành công là quota đã cập nhật ngay, đôi khi cần vài chục giây.

An toàn khi thao tác

Chạy thử liệt kê file trước, luôn luôn. Xem trước sẽ chuyển bao nhiêu file, tổng dung lượng bao nhiêu, rồi mới thực thi.

Chia nhỏ từng đợt (--limit N), đừng chạy hết cả tài khoản trong một lần. Lỡ có lỗi thì thiệt hại cũng nhỏ.

Việc nào không thể hoàn tác bên phía Google thì hỏi trước: files.delete, files.emptyTrash, share hàng loạt qua permissions.create. Được đồng ý một lần rồi thì không cần hỏi lại cho cùng loại việc đó trong cùng phiên làm việc.