【问题标题】:wget: downloaded file namewget:下载的文件名
【发布时间】:2011-12-20 10:30:07
【问题描述】:

我正在为 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]

【问题讨论】:

  • 也许 wget --content-disposition 'url'

标签: linux bash wget


【解决方案1】:
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: 标头来设置文件名

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

【讨论】:

  • 我喜欢这种方法,但不幸的是 Debian 衍生产品(例如 Ubuntu)中的 awk 不支持 match 中的第三个参数。
  • 虽然并不总是完全准确,但这是正确的方法。
  • 在 Ubuntu 中,您可以使用:wget --server-response -q -O - "https://very.long/url/here" 2>&1 | grep "Content-Disposition:" | tail -1 | awk -F"filename=" '{print $2}'
  • 实现它的现代简单方法:wget {link} --content-disposition
  • @balbelias:这将正确地使wget 使用服务器建议的名称。但是...如何检索它以将其分配给变量?
【解决方案2】:

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

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

【讨论】:

  • 工作就像一个魅力。非常感谢!
  • 警告:这不适用于包含重定向或动态内容的网址。请参阅 est 的答案以获得正确的解决方案。
  • 我喜欢!但如果有 URL 参数,它也不会完全起作用。例如https://github.com/awslabs/aws-well-architected-labs/blob/master/Reliability/300_Testing_for_Resiliency_of_EC2_RDS_and_S3/Code/Python/server.py?raw=1
【解决方案3】:

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

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

【讨论】:

  • 虽然不像其他答案那样“聪明”,但这种方法实际上具有简单性和可预测性的优点
【解决方案4】:

您可以像这样明确说明名称:

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

【讨论】:

    【解决方案5】:

    处理 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}
    

    【讨论】:

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

      我喜欢这个,因为wget 已经告诉你它正在保存的文件名。 sed 去除非文件名字符,即。撇号。

      【讨论】:

        【解决方案7】:
        ~ $ 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'
        

        【讨论】:

          【解决方案8】:

          @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"
          

          【讨论】:

            【解决方案9】:

            我猜你已经在变量中的某处获得了文件的完整 URL。使用 Bash 参数扩展去除前缀:

            echo ${url##*/}
            

            【讨论】:

              【解决方案10】:

              正如PizzaBeer mentionedwget 说他要保存文件的位置。这很重要,因为它将确保不会通过在文件名末尾添加一个数字来覆盖现有文件。

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

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

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

              【讨论】:

                【解决方案11】:

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

                试试这个:

                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 ;;
                

                我认为这对你有帮助

                【讨论】:

                  猜你喜欢
                  • 2011-01-30
                  • 2020-10-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多