Object 操作與 gcloud storage
GCS 的資料操作可以在 Cloud Console 完成,也可以使用 Google Cloud CLI。課程中使用的主要工具是 gcloud storage;舊有的 gsutil 仍可能出現在既有教材或環境中,但新操作優先使用 gcloud storage 指令家族。
Bucket 與 Object 路徑
GCS URI 的格式如下:
gs://BUCKET_NAME/OBJECT_NAME
例如:
gs://tkr101-demo/landing/2026/06/sell.csv
tkr101-demo是 Bucket。landing/2026/06/sell.csv是 Object name。landing/和2026/06/是名稱前綴,不是傳統檔案系統的實體資料夾。
步驟 1:在 Console 建立虛擬資料夾
- 開啟 Cloud Storage → Buckets。
- 點選 Bucket name。
- 點選 Create folder。
- 輸入
test_folder。 - 在資料夾內點選 Upload files。
這個操作方便人閱讀與瀏覽,但底層仍然是建立帶有 prefix 的 Object。
步驟 2:上傳檔案
先在本地建立一個測試檔案:
printf 'hello gcs\n' > test.txt
上傳到 Bucket 根目錄:
gcloud storage cp test.txt gs://BUCKET_NAME/
上傳到虛擬資料夾:
gcloud storage cp test.txt gs://BUCKET_NAME/test_folder/
即使 test_folder 原本不存在,指令仍可成功,因為它只是 Object name 的 prefix。
步驟 3:列出 Bucket 與 Object
列出所有 Bucket:
gcloud storage ls
列出某個 Bucket 的 Object:
gcloud storage ls gs://BUCKET_NAME
列出特定 prefix:
gcloud storage ls gs://BUCKET_NAME/test_folder/
遞迴列出所有內容:
gcloud storage ls --recursive gs://BUCKET_NAME
步驟 4:下載與複製 Object
下載並重新命名:
gcloud storage cp \
gs://BUCKET_NAME/test.txt \
test2.txt
在兩個 GCS URI 之間複製:
gcloud storage cp \
gs://SOURCE_BUCKET/source.txt \
gs://DESTINATION_BUCKET/archive/source.txt
遞迴複製整個本地資料夾:
gcloud storage cp --recursive \
./data \
gs://BUCKET_NAME/landing/data/
步驟 5:搬移或重新命名 Object
gcloud storage mv \
gs://BUCKET_NAME/test.txt \
gs://BUCKET_NAME/archive/test.txt
在一般 Bucket 中,Object rename 實際上可能是 copy 加 delete。大量 Object 移動前,先評估操作費用、權限、版本控制與中斷恢復策略。
步驟 6:檢視 Object Metadata
gcloud storage objects describe \
gs://BUCKET_NAME/test_folder/test.txt
可以從 metadata 確認:
- Object size。
- Content type。
- Creation time。
- Generation。
- Storage class。
- Hash 或 checksum。
資料管線排錯時,metadata 常比只看檔名更有用。
步驟 7:使用 rsync 同步
將本地資料夾同步到 GCS:
gcloud storage rsync --recursive \
./data \
gs://BUCKET_NAME/data/
建議先使用 dry run 檢查會有哪些變更:
gcloud storage rsync --recursive --dry-run \
./data \
gs://BUCKET_NAME/data/
rsync 是有方向性的
gcloud storage rsync SOURCE DESTINATION 是由 Source 方向同步到 Destination。它不是一般意義的雙向同步工具:
Local directory ───────────▶ GCS prefix
如果有人先在 GCS 手動新增檔案,再從本地執行 local → GCS 的 rsync,不應期待檔案自動下載回本地。
這種單向行為反而符合大多數 ETL:
Crawler / API → Local staging → GCS Bronze → BigQuery
如果真的需要把 GCS 掛載成類似本地檔案系統的介面,可以另外研究 Cloud Storage FUSE;但它有自己的快取、語意與效能限制,不應直接當成一般 POSIX 磁碟。
實用指令
查看指令說明:
gcloud storage --help
gcloud storage cp --help
gcloud storage rsync --help
查看 Bucket 使用量:
gcloud storage du --summarize gs://BUCKET_NAME
刪除單一 Object:
gcloud storage rm gs://BUCKET_NAME/test_folder/test.txt
遞迴刪除 prefix:
gcloud storage rm --recursive gs://BUCKET_NAME/test_folder/
常見問題
找不到本地檔案
確認目前工作目錄與檔案路徑:
pwd
ls -l test.txt
權限被拒
檢查目前登入帳號、Project 與 Bucket IAM。不要直接把 Bucket 設成公開來繞過權限問題。
不小心覆蓋了 Object
同名 Object 上傳可能建立新 generation 或覆蓋目前版本,行為取決於 Bucket 的 Object Versioning 與相關保護設定。重要資料上傳前,先確認 Object name、版本策略與 retention policy。