并行下载以获取URL和重命名列表

时间:2014-07-14 07:03:02

标签: linux wget

我有一个以制表符分隔的网址列表,以及目标文件名urls_to_download.txt,例如:

first_file.jpg\thttps://www.google.co.il/images/srpr/logo11w.png
/subdir_1/second_file.jpg\thttps://www.google.co.il/images/srpr/logo12w.png
...
last_file.jpg\thttps://www.google.co.il/images/srpr/logo99w.png

我想使用多个连接下载。

我可以这样做,例如:

cat urls_to_download.txt | xargs -n 1 -P 10 wget -nc

我的问题是,如何让文件获得我想要的新名称,因此输出目录将具有:

first_file.jpg
/subdir1/second_file.jpg
...
last_file.jpg

4 个答案:

答案 0 :(得分:3)

我猜这样的事情对你有用:

#!/bin/bash                                                                                                                                                                       
while read FILENAME URL; do
  wget -nc -O "$FILENAME" "$URL"
done <input.txt

其中input.txt是一个文件,其中包含制表符分隔的文件/网址对,每行一个。

答案 1 :(得分:1)

  1. 请注意,文件中的文件名使用绝对路径。因此,您最好将这些名称重写为相对路径。

  2. 在shell中,仅使用&来设置流程背景可以使您的工作平行。

  3. 例如,如果你想要并行,你可以这样做:

    #!/bin/bash
    while read FILENAME URL
    do
        wget -nc -O "./$FILENAME" "$URL" &   # So `wget` runs in background
    done < input.txt
    

    注意:上面的脚本只是一个提示,如果wget中有很多行,则会创建太多并行input.txt进程。有一些方法可以控制并行任务的数量,但是对于shell脚本来说或多或少都很复杂。

    控制并行任务数量的一种非常简单的方法,可确保最多有20个wget进程。

    #!/bin/bash
    NUMBER=0
    while read FILENAME URL
    do
        wget -nc -O "./$FILENAME" "$URL" &   # So `wget` runs in background
        NUMBER=$((NUMBER + 1))
        if [ $NUMBER -gt 20 ]
        then
            wait   # wait all background process to finish
            NUMBER=0
        fi
    done < input.txt
    wait
    

    然而,这种方法非常简单,它不是控制并行任务数量的最有效和最准确的方法。

答案 2 :(得分:0)

尝试此命令同时下载文件:

`cut -f 2 urls_to_download.txt | wget -i -;` 

`cut -f 2 urls_to_download.txt | sed 's/.*\///' | while read f; do mv $f $(cut -f 1 urls_to_download.txt); done`

我找不到使用wget选项正确重命名文件的方法,您需要修改以确保mv命令中存在该目录。

答案 3 :(得分:0)

只需使用wget的{​​{1}}选项:

  

-x
  --force-目录
  与-nd ---相反的是创建目录层次结构,即使没有创建目录   除此以外。例如。 wget -x http://fly.srk.fer.hr/robots.txt会将下载的文件保存到
  fly.srk.fer.hr/robots.txt。

-x

如果您的文件以制表符分隔:

xargs -n 1 -P 10 wget -nc < urls_to_download.txt

或许您可以将标签转换为换行符:

xargs -n 1 -d $'\t' -P 10 wget -nc -x < urls_to_download.txt