如何使用Curl下载文件后将文件名捕获到变量中?
捕获Curl下载文件的原始文件名到变量
这个问题我之前也碰到过,你原来的写法之所以不行,是因为curl -O(--remote-name)只是默默地把文件保存到本地,不会把文件名输出到标准输出里,所以命令替换$(...)自然捕获不到有效内容。下面给你两种实用的解决方法:
方法一:下载时同时捕获文件名
直接利用curl的--write-out(简写-w)参数,让它在下载完成后输出实际保存的文件名,同时用-sS保持静默但显示错误信息,这样就能一次完成下载和文件名捕获:
file1=$(curl -O -sS -w "%{filename_effective}\n" 'https://url.com/download_file.tgz') # 输出变量时建议用双引号,避免文件名含空格时出错 echo "$file1"
这里的%{filename_effective}是curl内置的变量,它会返回最终保存到本地的文件名(也就是远程文件的原始名称,因为我们用了-O参数)。
方法二:先获取文件名再下载
如果想先拿到文件名,再决定是否执行下载,可以通过HEAD请求获取响应头里的文件名,或者直接从URL提取:
# 先尝试从Content-Disposition响应头提取文件名 file1=$(curl -sI 'https://url.com/download_file.tgz' | grep -oP 'filename="\K[^"]+') # 如果响应头里没有文件名,就从URL提取basename作为 fallback if [ -z "$file1" ]; then file1=$(basename 'https://url.com/download_file.tgz') fi # 确认文件名后再下载 curl -O "https://url.com/download_file.tgz" echo "$file1"
这种方法适合需要提前判断文件名(比如检查是否已存在)的场景。
内容的提问来源于stack exchange,提问作者dataviews
相关产品推荐
相关产品推荐

