如何通过Bash脚本用youtube-dl获取频道/播放列表名称替换目录名
我帮你梳理了两种纯Bash的解决方案,完美解决你手动修改播放列表ID目录名的麻烦,完全不用Python!
方案一:简化脚本(推荐,少写代码更省心)
这个方案直接利用youtube-dl的内置变量自动处理目录结构,不用自己写循环,还能自动处理标题里的特殊字符:
#!/bin/bash # 检查参数是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <频道ID> <频道名称>" echo "示例: $0 UC-QDfvrRIDB6F0bIO4I4HkQ \"我的收藏频道\"" exit 1 fi CHANNEL_ID="$1" CHANNEL_NAME="$2" # 替换频道名称里的斜杠为横杠,避免目录创建失败 OUTPUT_DIR="./${CHANNEL_NAME//\//-}" # 创建频道根目录 mkdir -p "$OUTPUT_DIR" # 下载频道所有播放列表,每个播放列表自动存放在以其标题命名的子目录中 youtube-dl -f mp4 \ --yes-playlist \ --output "$OUTPUT_DIR/%(playlist_title)s/%(title)s.%(ext)s" \ "https://www.youtube.com/channel/$CHANNEL_ID/playlists" echo "所有播放列表已下载到: $(realpath "$OUTPUT_DIR")"
脚本说明:
- 你只需要传入频道ID和自定义的频道名称(不用从YouTube获取,你想叫什么就叫什么)
%(playlist_title)s是youtube-dl的内置变量,会自动替换成当前播放列表的真实标题,不管是公开还是私有(只要你有权限访问)- youtube-dl会自动处理标题里的非法字符(比如冒号、斜杠这些不能作为目录名的字符),不用你手动处理
方案二:保留原循环逻辑的修改版
如果你想保留原来的循环下载逻辑,我们可以用youtube-dl --get-title命令获取播放列表标题,再处理特殊字符后创建目录:
#!/bin/bash # 记录初始工作目录 initial_dir=$(pwd) clear # 检查参数是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <频道ID> <频道名称>" echo "示例: $0 UC-QDfvrRIDB6F0bIO4I4HkQ \"我的收藏频道\"" exit 1 fi CHANNEL_ID="$1" CHANNEL_NAME="$2" # 处理频道名称里的非法字符,创建频道根目录 CHANNEL_DIR="./${CHANNEL_NAME//\//-}" mkdir -p "$CHANNEL_DIR" # 获取频道下所有播放列表的链接 youtube-dl -j --flat-playlist "https://www.youtube.com/channel/$CHANNEL_ID/playlists" | \ grep -o '"url": "[^"]*"' | cut -d '"' -f4 | while IFS= read -r playlist_url; do # 获取播放列表的真实标题 playlist_title=$(youtube-dl --get-title "$playlist_url") # 替换标题里的非法字符(适配Linux/macOS,Windows的话可以补充替换: * ? " < > |) safe_title=${playlist_title//[\/:*?"<>|]/_} # 创建播放列表专属目录 playlist_dir="$CHANNEL_DIR/$safe_title" mkdir -p "$playlist_dir" # 切换到目录并下载 cd "$playlist_dir" youtube-dl -f mp4 "$playlist_url" # 提示下载完成的目录并返回初始目录 echo "已完成下载: $(realpath "$playlist_dir")" cd "$initial_dir" done echo "所有播放列表下载完成!"
脚本说明:
youtube-dl --get-title命令可以直接获取播放列表标题,即使是私有播放列表,只要你有权限访问(比如已经登录youtube-dl)就能拿到safe_title把标题里的非法字符替换成下划线,避免创建目录时出错
额外说明:处理私有播放列表和单个播放列表
- 私有播放列表访问:如果要下载私有播放列表,你需要让youtube-dl登录你的YouTube账号,推荐用cookie文件(更安全):
- 用浏览器登录YouTube,导出cookie为
cookies.txt(可以用浏览器插件实现) - 在脚本里的youtube-dl命令后加上
--cookies cookies.txt参数
- 用浏览器登录YouTube,导出cookie为
- 下载单个播放列表:如果只需要下载单个播放列表,可以用这个简化脚本:
#!/bin/bash if [ $# -ne 2 ]; then echo "用法: $0 <播放列表ID> <播放列表名称>" echo "示例: $0 PLxl69kCRkiI0oIqgQW3gWjDfI-e7ooTUF \"我的学习列表\"" exit 1 fi PLAYLIST_ID="$1" PLAYLIST_NAME="$2" safe_name=${PLAYLIST_NAME//[\/:*?"<>|]/_} mkdir -p "$safe_name" cd "$safe_name" youtube-dl -f mp4 "https://www.youtube.com/playlist?list=$PLAYLIST_ID" echo "已下载到: $(realpath "$safe_name")"
内容的提问来源于stack exchange,提问作者Abd-Elaziz Sharaf
相关产品推荐
相关产品推荐

