Quy tắc chuyển Google Drive đầy dung lượng giữa 2 tài khoản
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.