【问题标题】:make my autodownloading shell script better让我的自动下载 shell 脚本更好
【发布时间】:2009-04-24 11:37:37
【问题描述】:

所以我想从 rapidshare 下载多个文件。这是我目前拥有的。我通过运行创建了一个 cookie-

wget \
    --save-cookies ~/.cookies/rapidshare \
    --post-data "login=USERNAME&password=PASSWORD" \
    --no-check-certificate \
    -O - \
    https://ssl.rapidshare.com/cgi-bin/premiumzone.cgi \
    > /dev/null

现在我有一个运行的 shell 脚本,看起来像这样-

#!/bin/bash
wget -c --load-cookies ~/.cookies/rapidshare http://rapidshare.com/files/219920856/file1.rar
wget -c --load-cookies ~/.cookies/rapidshare http://rapidshare.com/files/393839302/file2.rar
wget -c --load-cookies ~/.cookies/rapidshare http://rapidshare.com/files/398293204/file3.rar
....

我想要两件事-

  1. shell 脚本需要读取文件才能从文件中下载。
  2. shell 脚本应一次下载 2 到 8 个文件。

谢谢!

【问题讨论】:

    标签: linux shell debian wget


    【解决方案1】:

    如果您需要并行作业,请考虑 make

    #!/usr/bin/make -f
    
    login:
            wget -qO/dev/null \
    --save-cookies ~/.cookies/rapidshare \
    --post-data "login=USERNAME&password=PASSWORD" \
    --no-check-certificate \
    https://ssl.rapidshare.com/cgi-bin/premiumzone.cgi
    $(MAKEFILES):
    %: login
            wget -ca$(addsuffix .log,$(notdir $@)) \
    --load-cookies ~/.cookies/rapidshare $@
            @echo "Downloaded $@ (log in $(addsuffix .log,$(notdir $@)))"
    

    将其保存为 rsget$PATH 的某处(确保使用制表符而不是空格进行缩进),给它chmod +x,然后运行

    rsget -kj8 \
        http://rapidshare.com/files/219920856/file1.rar \
        http://rapidshare.com/files/393839302/file2.rar \
        http://rapidshare.com/files/398293204/file3.rar \
        ...
    

    这将登录,然后wget 每个目标。 -j8 告诉 make 最多并行运行 8 个作业,-k 表示“即使目标返回失败也要继续运行”。

    编辑

    使用 GNU Make 3.79 和 3.81 测试。

    【讨论】:

    • 我输入了几个 url,然后按 Enter 2 次:这就是我得到的:rsget:10: *** 多个目标模式。停止。
    • 嗯,它适用于 GNU Make 3.81。你有什么版本?我可以解决...
    • 当 bash 有数组并且作业可以在后台运行时,为什么要使用 make?
    【解决方案2】:

    试试这个。我认为它应该做你想做的事:

    #! /bin/bash
    
    MAX_CONCURRENT=8
    URL_BASE="http://rapidshare.com/files/"
    cookie_file=~/.cookies/rapidshare
    
    # do your login thing here...
    
    [ -n "$1" -a -f "$1" ] || { echo "please provide a file containing the stuff to download"; exit 1; }
    
    inputfile=$1
    count=0
    while read x; do
      if [ $count -ge $MAX_CONCURRENT ]; then
        count=0
        wait
      fi
      { wget -c --load-cookies "$cookie_file" "${URL_BASE}$x" && echo "Downloaded $x"; } &
      count=$((count + 1))
    done < $inputfile
    

    【讨论】:

    • 我将 URL_BASE="rapidshare.com/files" 行更改为 URL_BASE = "",当脚本运行时,它正在按顺序下载。
    • 我忘记在后台运行 wget 进程。立即尝试。
    • 查看sitaramc.googlepages.com/queue.sh 以获得在 shell 中同时运行作业的更好方法。
    • 现在脚本做了一些非常有趣的事情。它将开始下载一个文件,然后停止一段时间并转到另一个文件,然后停止该文件并转到另一个文件,依此类推......最后它会下载所有内容,但这仍然是顺序的。
    • 是的,这个脚本有一个“特性”/“bug”:它会同时启动 3 个,然后等待所有 3 个都完成后再开始。在我之前的评论中指向queue.sh 的链接显示了一种能够更动态地启动作业的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2014-12-21
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多