我有一个以制表符分隔的网址列表,以及目标文件名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
答案 0 :(得分:3)
我猜这样的事情对你有用:
#!/bin/bash
while read FILENAME URL; do
wget -nc -O "$FILENAME" "$URL"
done <input.txt
其中input.txt是一个文件,其中包含制表符分隔的文件/网址对,每行一个。
答案 1 :(得分:1)
请注意,文件中的文件名使用绝对路径。因此,您最好将这些名称重写为相对路径。
在shell中,仅使用&
来设置流程背景可以使您的工作平行。
例如,如果你想要并行,你可以这样做:
#!/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