yt-dlp结合bash脚本按URL提取文件夹名分类下载异常求助
问题分析与解决方案
我帮你拆解下核心问题,然后一步步解决这个文件夹提取错误的问题:
核心问题根源
- 你误解了yt-dlp
--exec参数的{}含义:默认情况下{}代表的是下载完成后的文件路径,不是你批量文件里的原始视频URL!所以你的脚本里用$1获取的是文件路径,不是目标URL,自然提取不出正确的文件夹名。 -o参数的%(playlist)s导致提前生成NA文件夹:因为你的URL是单个视频,不是播放列表,yt-dlp会用NA代替不存在的播放列表名,提前创建了NA文件夹。- 参数传递错误:你后来尝试传递
$file_path,但这个变量在yt-dlp的命令环境中根本没有定义,传递的是空值,导致后续移动操作出错。
步骤1:修正提取文件夹的脚本
修改你的script.sh,让它正确接收原始URL和下载后的文件路径:
#!/bin/bash # 接收两个参数:$1=原始视频URL,$2=下载完成的文件路径 original_url="$1" downloaded_file="$2" # 从URL中提取目标文件夹名:对应URL的第6个/分割段 folder_name=$(echo "$original_url" | cut -d "/" -f6) # 检查是否成功提取文件夹名 if [[ -z "$folder_name" ]]; then echo "无法从URL $original_url 提取文件夹名" >> ~/script_error.log exit 1 fi # 创建目标文件夹(不存在则自动创建) mkdir -p "$folder_name" # 将下载文件移动到目标文件夹,保留原文件名 mv "$downloaded_file" "$folder_name/$(basename "$downloaded_file")" echo "文件 $(basename "$downloaded_file") 已移动到文件夹 $folder_name" >> ~/script.log
给脚本添加执行权限:
chmod +x ~/script.sh
步骤2:修正yt-dlp调用命令
用yt-dlp的占位符传递正确的参数:
%(webpage_url)s:代表批量文件里的原始视频URL(这才是你需要提取文件夹名的来源){}:代表下载完成后的文件路径(默认值,也可以用%(filepath)s)
修改后的命令:
yt-dlp --referer "https://ppppppppppp.com/" --add-header "Cookie:COOKIE" --batch-file links_da_scaricare.txt -o '%(title)s.%(ext)s' --exec "~/script.sh %(webpage_url)s {}"
注意:这里把-o参数改成了%(title)s.%(ext)s,避免yt-dlp提前生成NA文件夹,后续由脚本统一管理文件路径。
Cygwin环境额外注意事项
- 确保脚本路径用Cygwin格式:
~/script.sh对应C:\cygwin64\home\Administrator\script.sh,如果用Windows路径需要转成Cygwin识别的格式(比如/cygdrive/c/cygwin64/home/Administrator/script.sh) - 可以先单独测试脚本是否正常工作:
执行后应该会生成./script.sh "https://www.ppppppppppp.com/it/yyyy/911-omicidio-al-telefono/stagione-1-appesa-a-un-filo" "test.mp4"911-omicidio-al-telefono文件夹,并把test.mp4移动进去。
内容的提问来源于stack exchange,提问作者user3520363
相关产品推荐
相关产品推荐

