我在文本文件中有一个URL列表:
http://host/index.html
http://host/js/test.js
http://host/js/sub/test_sub.js
http://host/css/test.css
我想通过在我的文件系统上复制相同的树来下载这些文件。例如,我想在完成后以下面的树结束:
wd/
|_index.html
|_js/
| |_test.js
| |_sub/
| |_test_sub.js/
|_css/
|_test.css
这是我尝试过的:
在列表中添加目标文件作为第二个参数:
http://host/index.html
http://host/js/test.js js/test.js
http://host/js/sub/test_sub.js js/sub/test_sub.js
http://host/css/test.css css/test.css
使用while循环告诉wget
保存这些内容:
while read url target; do
wget "$url" -P "$target";
done < site_media_list.txt
这不起作用,最终结果是同一目录中的所有文件,没有新目录。
答案 0 :(得分:3)
创建一个只包含链接列表(没有路径)的文件,每行一个,然后wget -nH -x -i links_list.txt
将文件下载到工作目录,保持目录结构不变。下面给出了同一命令的更易读的版本。
wget --no-host-directories --force-directories --input-file=links_list.txt
Wget有许多灵活的目录选项。查看man wget
directory options了解更多信息。
答案 1 :(得分:0)
假设您的文件site_media_list.txt
仅包含文件列表(而不是目标目录),您应该能够从URL中解析出目录名称:
while read -r url ; do
s=$(echo "$url" | sed -E 's#http://host/(.*/)?.*$#\1#')
if [[ -z "$s" ]]; then
echo "working dir"
wget "$url"
else
echo "subdir"
mkdir -p "$s"
wget $url -P "$s"
fi
done < site_media_list.txt
看起来您遇到的主要问题是您将目录名称和文件名传递给wget
- 您只需要传递目录名称 - wget
将从URL计算文件名。
答案 2 :(得分:0)
将/
上的路径拆分为数组,仅使用相关元素创建路径。
#!/bin/bash
while read url ; do
IFS=/ parts=($url)
if (( ${#parts[@]} > 4 )) ; then
IFS=/ path="${parts[*]:3:${#parts[@]}-4}"
mdkir -p "$path"
fi
IFS=/ wget -O "${parts[*]:3}" "$url"
done