通过编程从Google Drive下载时保留文件名的方法
嘿,我之前也帮人解决过一模一样的问题——批量导出Google Docs到同名Markdown,核心痛点就是保留原文件名,你之前用的curl命令踩的坑我太熟了:-O参数会傻愣愣地把URL最后一段当文件名,结果就出现了那些乱码的&exportFormat=docx后缀,手动指定ID当文件名又完全不符合需求。直接上干货,分步骤解决:
1. 先搞定「获取原文件名」的核心问题
这是整个流程的关键,因为Google Docs的导出接口不会主动返回原文件名,得单独获取:
方案A:用Google Cloud CLI(最省心,不用自己写API逻辑)
先安装gcloud CLI,登录你的Google账号(确保有权限访问这些文档):
gcloud auth login
给单个文件获取原文件名的命令:
FILE_ID="你的文件ID" ORIGINAL_NAME=$(gcloud drive files describe $FILE_ID --format="value(name)") echo $ORIGINAL_NAME # 输出就是Google Drive里的原文件名
方案B:纯curl+授权头(适合不想装gcloud的场景)
先获取临时访问令牌(用gcloud一键生成,不用手动申请OAuth):
ACCESS_TOKEN=$(gcloud auth print-access-token)
然后从导出接口的响应头里提取原文件名(Content-Disposition字段里藏着文件名):
FILE_ID="你的文件ID" ORIGINAL_NAME=$(curl -H "Authorization: Bearer $ACCESS_TOKEN" -I "https://docs.google.com/document/d/$FILE_ID/export?format=docx" | grep -o 'filename="[^"]*"' | cut -d'"' -f2)
注意:如果是公开可访问的文档,直接去掉
-H "Authorization: Bearer $ACCESS_TOKEN"就行。
2. 下载成带原文件名的docx
用gcloud(一步到位,自动匹配原文件名)
gcloud drive files export $FILE_ID --destination "$ORIGINAL_NAME.docx" --mime-type application/vnd.openxmlformats-officedocument.wordprocessingml.document
用curl(手动指定输出文件名)
curl -H "Authorization: Bearer $ACCESS_TOKEN" -L "https://docs.google.com/document/d/$FILE_ID/export?format=docx" -o "$ORIGINAL_NAME.docx"
重要提醒:文件名里有空格、中文或特殊字符时,必须用双引号包裹变量,不然shell会报错。
3. 把docx转成同名Markdown
用pandoc(几乎是文档格式转换的行业标准工具,先安装:sudo apt install pandoc / brew install pandoc):
pandoc "$ORIGINAL_NAME.docx" -o "$ORIGINAL_NAME.md"
可选优化:如果转换后图片、表格格式有偏差,可以加参数调整,比如
--extract-media=./media把图片提取到单独文件夹,或者--reference-doc指定格式模板。
4. 批量处理脚本(一次性搞定所有文件)
把所有文件ID放到一个文本文件file_ids.txt里(每行一个ID),然后写个shell脚本batch_export.sh:
#!/bin/bash # 先获取访问令牌(公开文档可跳过此行) ACCESS_TOKEN=$(gcloud auth print-access-token) # 循环处理每个文件ID while read FILE_ID; do # 获取原文件名(用gcloud的方式,稳定可靠) ORIGINAL_NAME=$(gcloud drive files describe $FILE_ID --format="value(name)") echo "正在处理:$ORIGINAL_NAME" # 下载docx gcloud drive files export $FILE_ID --destination "$ORIGINAL_NAME.docx" --mime-type application/vnd.openxmlformats-officedocument.wordprocessingml.document # 转成Markdown pandoc "$ORIGINAL_NAME.docx" -o "$ORIGINAL_NAME.md" # 可选:删除临时docx文件 # rm "$ORIGINAL_NAME.docx" done < file_ids.txt
给脚本加执行权限后运行:
chmod +x batch_export.sh ./batch_export.sh
内容的提问来源于stack exchange,提问作者Joe Shields




