【问题标题】:How to force wget to overwrite an existing file ignoring timestamp?如何强制 wget 覆盖忽略时间戳的现有文件?
【发布时间】:2015-05-23 22:27:59
【问题描述】:

我尝试了“-N”和“--no-clobber”,但我得到的唯一结果是检索现有 example.exe 的新副本,其中编号是使用此语法“example.exe.1”添加的数字'。这不是我想要的。我只需要在我已经保存了 example.com 副本的同一文件夹中下载并覆盖文件 example.exe,而 wget 会验证我的文件是旧的还是新的,尊重我的下载文件夹中已经存在的 on example.exe 文件.你认为我可能吗,或者我需要创建一个脚本来删除 example.exe 文件,或者可能会改变他的修改日期等?

【问题讨论】:

    标签: wget


    【解决方案1】:

    如果您使用-O 选项指定输出文件,它将覆盖任何现有文件。

    例如:

    wget -O index.html bbc.co.uk
    

    多次运行会覆盖 index.html。

    【讨论】:

    • 在下载文件的时候(包括第一次)也会触摸文件,所以不使用-O开关时不会保留文件原来的时间戳。跨度>
    【解决方案2】:

    wget 不允许您覆盖现有文件,除非您在命令行中使用选项 -O 显式命名输出文件。

    我有点懒,当从下载的文件中已经知道输出文件名时,我不想在命令行上键入输出文件名。因此,我像这样使用 curl:

    curl -O http://ftp.vim.org/vim/runtime/spell/fr.utf-8.spl
    

    从不安全的网站下载此类文件时要小心。上面的命令将写入一个文件,命名为连接的网站希望命名它(虽然在当前目录中)。最终名称可能通过重定向和 php 脚本隐藏或在 URL 中被混淆。您最终可能会覆盖您不想覆盖的文件。

    如果您在使用curl 之后在当前目录中发现了一个名为ls 或任何其他诱人名称的文件,请不要执行下载的文件。它可能是从流氓或损坏的网站下载的木马!

    【讨论】:

    • 他回答了这个问题 :) 他说必须使用wget https://url.com -O filename_to_squash.py——此外,他解释了为什么要小心下载和运行可执行文件!
    【解决方案3】:
    wget --backups=1 google.com
    

    .1 后缀重命名原始文件并将新文件写入预期的文件名。

    不完全符合要求,但在某些情况下可能会很方便。

    【讨论】:

      【解决方案4】:

      -c--continue

      来自manual

      如果你在非空文件上使用'-c',并且服务器不支持 继续下载,Wget 将从头开始下载并 完全覆盖现有文件

      【讨论】:

      • 服务器通常支持继续下载。
      • 如果服务器不支持继续下载并且不支持默认行为,这是一个注释。所以这个答案是错误的。
      • -c 似乎是个好主意,但它不会检查文件内容是否已更改,如果您定期下载(也称为脚本)随时间更新的文件 -c 会咬你。
      • 如果两端的文件匹配,但是有一个消息:HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable The file is already fully retrieved; nothing to do.
      【解决方案5】:

      我喜欢 -c 选项。我从手册页开始,然后是网络,但我已经搜索了好几次。就像您正在中继网络摄像头一样,因此图像需要始终命名为 image.jpg。似乎在手册页中应该更清楚。

      几年来我一直在使用它在后台下载东西,有时在我的 wgetrc 文件中与“limit-rate =”结合使用

      while true
      do
      wget -c -i url.txt && break
      echo "Restarting wget"
      sleep 2
      done
      

      创建一个名为 url.txt 的小文件并将文件的 URL 粘贴到其中。将此脚本设置在您的路径中,或者作为别名设置并运行它。它会不断重试下载,直到没有错误为止。有时最后会进入循环显示

       416 Requested Range Not Satisfiable
       The file is already fully retrieved; nothing to do.
      

      但这是无害的,只需 ctrl-c 即可。我认为它总是得到我想要的文件,即使 wget 重试次数用完或连接暂时消失。我用它一次下载了好几天的东西。拨号上的 CD 映像,是的,总是使用 wget。

      【讨论】:

        【解决方案6】:

        我的用例涉及两个不同的 URL,有时第二个不存在,但如果存在,我希望它覆盖第一个文件。

        使用wget -O的问题是,当第二个文件不存在时,会用空白文件覆盖第一个文件。

        所以我能找到的唯一方法是使用 if 语句:

        --spider checks if a file exists, and returns 0 if it does
        --quiet fail quietly, with no output
        -nv is quiet, but still reports errors
        
        wget -nv https://example.com/files/file01.png -O file01.png
        # quietly check if a different version exists
        wget --quiet --spider https://example.com/custom-files/file01.png
        if [ $? -eq 0 ] ; then    
            # A different version exists, so download and overwrite the first
            wget -nv https://example.com/custom-files/file01.png -O file01.png
        fi
        

        它很冗长,但我发现它是必要的。我希望这对某人有帮助。

        【讨论】:

          【解决方案7】:

          这是一种通过参数修剪来完成它的简单方法

          url=https://example.com/example.exe ; wget -nv $url -O ${url##*/}
          

          或者你可以使用基本名称

          url=https://example.com/example.exe ; wget -nv $url -O $( basename $url )
          

          【讨论】:

            【解决方案8】:

            不想使用-O,只想指定输出目录的,可以使用以下命令。

            wget \
                --directory-prefix "$dest" \
                --backups 0 \
                -- "$link"
            

            【讨论】:

              猜你喜欢
              • 2015-02-11
              • 2014-08-09
              • 1970-01-01
              • 2013-05-26
              • 2017-04-06
              • 2018-06-30
              • 1970-01-01
              • 2018-12-08
              • 2015-01-20
              相关资源
              最近更新 更多