#!/bin/bash # 输入文件路径(包含 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 "所有文件处理完成!"