频道 1200 条视频按发布年份归档,我用文件名排序翻车了
上周想给频道做一次归档:1200 多条视频,从 2019 年到现在,打算按年份分目录,方便后面查素材。环境很普通,macOS 上用 zsh,数据是之前用 yt-dlp 拉下来的 JSON 元数据加视频文件,单个 JSON 几十 KB,总量不到 200 MB,不算大数据。
第一版做法很直接:读出每条的 upload_date,取前四位当年份,mkdir -p 后 mv 过去。跑完发现两个问题。一是 upload_date 为空的条目全被塞进了「0000」目录,大概 30 多条;二是文件名里有全角冒号和问号,mv 时直接被截断,几个文件覆盖成了同名。
改法是先做一遍 dry-run,只打印不移动:
jq -r '[.id, (.upload_date // "NULL"), .title] | @tsv' meta/*.json \
| awk -F'\t' '{y = ($2=="NULL") ? "unknown" : substr($2,1,4); print y"\t"$1"\t"$3}'
确认无误后再按 id 移动,而不是按标题:
while IFS=$'\t' read -r y id title; do
mkdir -p "out/$y"
find src -name "$id.*" -maxdepth 1 -exec mv {} "out/$y/" \;
done < plan.tsv
为什么按 id 而不按标题:标题里的字符集不可控,全角符号、emoji、换行都出现过,文件名只是展示层,id 才是稳定主键。代价是归档后目录里看不出内容,得配一份 index.tsv 另存标题映射。
这套做法会失效的地方:upload_date 缺失时用 unknown 兜底,但如果你的频道有直播回放,它的 upload_date 和 actual_start_time 不是一回事,按上传年份归档会把跨年直播分错;另外 find -name “$id.*” 在文件名带空格时没问题,但 id 前缀相同的文件(极少见)会一起被移走,稳妥点可以改用精确后缀匹配。我自己踩过的坑是 mv 跨文件系统时会先复制再删除,中途断掉会留下半个文件,量大时建议先 cp 校验再删源。
现在想确认一件事:你们归档视频时是按 upload_date 还是按内容里的实际拍摄时间?直播回放和首播这两类你们怎么处理?
0
赞同度 100% · 0 条评论 · 5 阅读
0 条评论
还没有评论,写下第一条。