You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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文件(更安全):
    1. 用浏览器登录YouTube,导出cookie为cookies.txt(可以用浏览器插件实现)
    2. 在脚本里的youtube-dl命令后加上--cookies cookies.txt参数
  • 下载单个播放列表:如果只需要下载单个播放列表,可以用这个简化脚本:
    #!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:07:36