wget:下载文件名

时间:2011-12-20 10:30:07

标签: linux bash wget

我正在为bash编写脚本,我需要使用wget获取下载文件的名称,并将名称放入$ string

例如,如果我在下面下载此文件,我想将其名称mxKL17DdgUhcr.jpg添加到$ string

wget http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg
45439 (44K) [image/jpeg]
Saving to: «mxKL17DdgUhcr.jpg»

100%[===================================================================================================>] 45 439      --.-K/s   в 0s

2011-12-20 12:25:33 (388 MB/s) - «mxKL17DdgUhcr.jpg» saved [45439/45439]

11 个答案:

答案 0 :(得分:36)

wget --server-response -q -O - "https://very.long/url/here" 2>&1 | 
  grep "Content-Disposition:" | tail -1 | 
  awk 'match($0, /filename=(.+)/, f){ print f[1] }' )

这是正确的版本,因为可能有多个301/302重定向,最后是Content-Disposition:标头来设置文件名

根据网址猜测文件名并不总是正确的。

答案 1 :(得分:28)

使用basename命令从网址中提取文件名。例如:

url=http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg
filename=$(basename "$url")
wget "$url"

答案 2 :(得分:16)

您可以在下载前指定文件名,-O选项wget

wget -O myfile.html http://www.example.com/

答案 3 :(得分:3)

你可以明确地说出这样的名字:

url='http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg'
file=`basename "$url"`
wget "$url" -O "$file"

答案 4 :(得分:2)

处理URL编码的文件名:

URL="http://www.example.com/ESTAD%C3%8DSTICA(2012).pdf"
BASE=$(basename ${URL})             # ESTAD%C3%8DSTICA(2012).pdf
FILE=$(printf '%b' ${BASE//%/\\x})  # ESTADÍSTICA(2012).pdf
wget ${URL}

答案 5 :(得分:1)

~ $ URL='http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg'
~ $ echo ${URL##*/}
mxKL17DdgUhcr.jpg
~ $ wget $URL -O ${URL##*/}
--18:34:26--  http://pics.sitename.com/images/191211/mxKL17DdgUhcr.jpg
           => `mxKL17DdgUhcr.jpg'

答案 6 :(得分:0)

我猜你已经在变量的某个地方拥有了该文件的完整URL?使用bash参数扩展来去除前缀:

echo ${url##*/}

答案 7 :(得分:0)

@Gowtham Gopalakrishnan的答案的替代方法 很简单

wget --server-response -q "https://very.long/url/here" 2>&1 | awk -F"filename=" '{if ($2) print $2}'

仅输出内容配置中设置的文件的名称

示例

$ wget --server-response -q https://hostname/filename-that-i-liek.zip 2>&1 | awk -F"filename=" '{if ($2) print $2}'
"filename-that-i-liek.zip"
$

答案 8 :(得分:0)

#!/bin/bash
file=$(wget $1 2>&1 | grep Saving | cut -d ' ' -f 3 | sed -e 's/[^A-Za-z0-9._-]//g')

我喜欢这样,因为wget已经告诉您要保存的文件名。 sed去除非文件名字符,即。撇号。

答案 9 :(得分:0)

正如@PizzaBeer 所提到的,wget 表示他将保存文件的位置。这很重要,因为它可以通过在文件名末尾添加数字来确保不会覆盖现有文件。

所以这是我使用 grep 缩小好线的解决方案(需要 --line-buffered,因为 wget 的工作方式,请参阅 here)和 sed提取文件名。

wget --content-disposition $1 2>&1 | grep "Saving to" --line-buffered | sed -r 's/Saving to: ‘(.*)’/\1/'

您可以将其存储在一个变量中,该变量将在下载结束时填充。

答案 10 :(得分:-2)

所以你想把文件/图像名称作为参数

试试这个

echo -n "Give me the name of file in http://pics.sitename.com/images/191211/ :"

read $string

sudo wget http://pics.sitename.com/images/191211/$string ;;

我认为这可以帮到你