我想知道 curl/wget 下载的文件的文件名。
http://stackoverflow.com/questions/6881034/curl-to-grab-remote-filename-after-following-location 这里介绍的方法是从 header 中获取,但有些下载服务器 header 里面并不包括文件名信息。
比如说我
wget https://update.pushbullet.com/pushbullet_installer.exe
在 shell 脚本中我想获得 “ pushbullet_installer.exe ”, 已备后用。
简单的实现:
#!/usr/bin/env bash
url=$1
filename=$(curl -skIL $url | grep -o -E 'filename=.*$' | sed -e 's/filename=//')
#trim
filename="$(echo -e "${filename}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
#未从 header 中获取到文件名
if [ ${#filename} -le 1 ]
then
url_arr=(${url//\// })
filename="${url_arr[-1]}"
fi
echo $filename
1
ljbha007 2015-08-29 22:30:05 +08:00
curl http://www.baidu.com > baidu.html
|
2
ljbha007 2015-08-29 22:30:25 +08:00 1
搞错楼主意思了
|
4
realpg 2015-08-29 22:34:21 +08:00 1
wget -o 就能指定保存的名字 好像是-o 要不就是大写-O 吧 你自己 man wget 确认一下
然后你就可以把这个名字用自定义的变量设置了,回头再用这个变量引用 |
5
sparkrat 2015-08-29 22:36:47 +08:00 2
|
6
sobigfish 2015-08-29 22:37:05 +08:00 1
|
7
iyaozhen OP @realpg 嗯, curl/wget 都有这个指令,这个方法我想过,但是我也不知道后缀。而且文件名指定为时间戳啥的我就不知道这个文件是哪个了。
|
9
iyaozhen OP @sobigfish 截取 url 不行,这种下载的 url 就悲剧了。 http://www.vim.org/scripts/download_script.php?src_id=10872
|
10
realpg 2015-08-29 22:45:09 +08:00
@iyaozhen 那就字符串分割,用 shell 脚本内实现 split ,用 /分割取最后一段
实现方法很多了, cut , tr 什么的都行自己随便找一种 |
12
realpg 2015-08-29 22:47:56 +08:00
|
13
iyaozhen OP @realpg curl -J 可以。
不过你这句话提醒了我。对于直接下载链接可以通过截取 url 获得文件名。对于类似 PHP 直接以文件流的方式输出文件的下载链接就可以读 header 了(按照规范,需要在 header 中指出文件名)。 |
14
oott123 2015-08-30 07:42:29 +08:00 via Android
你有没有想过,如果重名, wget 还会在文件名后面加数字…
我觉得读取 wget 的 stdio 再正则取比较靠谱… |
18
iyaozhen OP |
21
lizhenjia569 2021-04-16 23:51:54 +08:00
我也是为了这个搞半天,最终效果还行吧,tee 管道会让下载进度条一行行显示,只能限制输出频率了:
```shell # sed 命令正则匹配分组引用: https://stackoverflow.com/a/58379307/11687405 # 为了管道传给 sed 的同时下载信息打印到屏幕,使用 tee 命令重定向 stderr: https://stackoverflow.com/a/20553986/11687405 # 添加 wget 参数--progress=dot:giga,避免小文件显示太多信息(显示一个点代表 1MB ): https://stackoverflow.com/a/35427299/11687405 filename=$(wget --progress=dot:giga https://update.pushbullet.com/pushbullet_installer.exe 2>&1 | tee >(cat 1>&2) | sed -nr "s/.* - ‘(.+)’ saved .*/\1/p") echo 下载好的文件名为:$filename ``` |
22
lizhenjia569 2021-04-16 23:55:01 +08:00
我的写法返回的是下载完毕直接返回 wget 保存好的文件名
|