| # 输入文件路径(包含 URL 的文件) | |
| input_file="urls.txt" | |
| # 最大并发数(可以根据需要调整) | |
| max_concurrent=15 | |
| # 检查输入文件是否存在 | |
| if [[ ! -f "$input_file" ]]; then | |
| echo "错误:文件 $input_file 不存在!" | |
| exit 1 | |
| fi | |
| # 计数器,用于跟踪当前正在运行的任务数量 | |
| running_tasks=0 | |
| # 逐行读取文件中的 URL | |
| while IFS= read -r url; do | |
| # 检查 URL 是否为空 | |
| if [[ -z "$url" ]]; then | |
| continue | |
| fi | |
| # 提取 preprocessed 后面的字段作为目录名 | |
| directory=$(echo "$url" | grep -oP '(?<=preprocessed/)[^/]+') | |
| # 如果提取不到目录名,跳过该 URL | |
| if [[ -z "$directory" ]]; then | |
| echo "警告:URL $url 缺少有效的目录信息,跳过!" | |
| continue | |
| fi | |
| # 创建目标目录(如果不存在) | |
| mkdir -p "$directory" | |
| # 提取文件名 | |
| filename=$(basename "$url") | |
| # 下载文件到目标目录(并发执行) | |
| ( | |
| echo "正在下载 $url 到 $directory/$filename ..." | |
| wget -q -O "$directory/$filename" "$url" | |
| if [[ $? -eq 0 ]]; then | |
| echo "下载成功:$directory/$filename" | |
| else | |
| echo "下载失败:$url" | |
| fi | |
| ) & | |
| # 更新并发任务计数器 | |
| running_tasks=$((running_tasks + 1)) | |
| # 如果达到最大并发数,等待部分任务完成 | |
| if [[ $running_tasks -ge $max_concurrent ]]; then | |
| wait -n # 等待任意一个后台任务完成 | |
| running_tasks=$((running_tasks - 1)) | |
| fi | |
| done < "$input_file" | |
| # 等待所有剩余的任务完成 | |
| wait | |
| echo "所有文件处理完成!" | |