如何通过Airflow将GCS存储桶文件扁平化复制到Linux VM
GCS存储桶全量文件平级复制到Linux本地方案
需求对应效果
将GCS存储桶内所有嵌套路径下的文件,全部复制到Linux本地指定目录,丢弃原有目录层级,所有文件直接存放在目标目录的同一层级。
示例对应关系:
- 源GCS桶:
landing-gcp-cloud-12gd45- 源文件路径:
gs://landing-gcp-cloud-12gd45/file1/file1.csv、gs://landing-gcp-cloud-12gd45/file2.csv、gs://landing-gcp-cloud-12gd45/file3/file3.txt
- 源文件路径:
- 本地目标目录:
files- 落地后路径:
files/file1.csv、files/file2.csv、files/file3.txt
- 落地后路径:
前置准备
- Linux虚拟机已完成
gsutil工具的安装与鉴权配置,当前使用的账号拥有源存储桶的对象读取权限 - 提前创建本地目标目录:
mkdir -p ./files
基础实现命令
直接执行以下shell命令即可完成复制,自动跳过虚拟目录,仅处理文件,自动剥离原路径保留纯文件名:
gsutil ls -r gs://landing-gcp-cloud-12gd45/** | while read -r gcs_obj; do # 过滤路径结尾带/的目录项,仅处理文件 if [[ ! $gcs_obj =~ /$ ]]; then # 提取纯文件名,复制到本地目标目录 gsutil cp "$gcs_obj" "./files/$(basename "$gcs_obj")" fi done
重名文件兼容处理
如果存储桶内不同路径下存在同名文件,上述命令默认会覆盖目标目录下的同名文件。如果需要避免覆盖,可以使用带重名自动加序号的版本:
gsutil ls -r gs://landing-gcp-cloud-12gd45/** | while read -r gcs_obj; do if [[ ! $gcs_obj =~ /$ ]]; then filename=$(basename "$gcs_obj") target="./files/$filename" # 重名时自动追加数字后缀 if [ -f "$target" ]; then count=1 while [ -f "./files/${filename%.*}_${count}.${filename##*.}" ]; do count=$((count+1)) done target="./files/${filename%.*}_${count}.${filename##*.}" fi gsutil cp "$gcs_obj" "$target" fi done
结果校验
复制完成后执行以下命令查看目标目录文件列表,确认所有文件已平级存放:
ls ./files
内容的提问来源于stack exchange,提问作者Himanshu Sharma
相关产品推荐
相关产品推荐

