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

*2026-08-15*

> Chuyển file Drive từ tài khoản đầy sang tài khoản khác, giữ link cũ, giải phóng dung lượng thật. Viết cho người hoặc agent điều phối đọc là làm được ngay, không cần hỏi lại.

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.