最近归档下载视频的时候,发现下载文件名设置成作者-标题-日期.mp4这样的格式了,如我是作者-这是一个视频-2024-05-20 21-05-28.mp4。归档则需要改成作者/日期.mp4这样的格式,也就是在作者目录下存放日期.mp4的视频文件。
可以看到,日期有两个部分,其中的时间部分我觉得可以使用rename去除,因为有空格后续处理比较麻烦,而且这些视频不太会出现一天多条的情况。实在遇到这种情况手动确认更好一些。
rename 's/\ ..-..-...mp4/.mp4/' *.mp4
一开始我计划只用rename实现,因为理论上只要将中间的-标题-替换成/即可(还需要加上-p创建没有的目录),所以只能用正则的情况下,只会替换第一个-,并且有些中文也会被切割成错误数据。而 Perl 我没了解过,实在是弄不出来。
然后我就想用sed来处理这些文件名。一开始使用echo $i | sed -E 's/^(([^-]*-){1}).*$/\1/'获取了作者-,但是sed获取最后的日期太困难了。
这时候我突然想起,可以用cut啊,这就是用来提取文本的,而且非常符合这个场景。完成的脚本如下:
#!/bin/bash
#
rename 's/\ ..-..-...mp4/.mp4/' *.mp4
for i in *.mp4; do
dirname=$(echo $i | cut -d "-" -f 1)
filename=$(echo $i | cut -d "-" -f 3-7)
mkdir -p "$dirname"
mv -nv "$i" "$dirname/$filename"
done
使用cut使用-d表示分隔符是-,接着-f 1提取第一个-之前的作者作为目录名称,然后使用-f 3-7第 3 个-之后到最后的日期作为文件名(7写成8或者更大的也行):
后面需要使用mkdir和mv,而不是rename -p,因为为了防止作者或者名称中有空格,让 Shell 拆分命令,需要给变量加上双引号。
而mkdir -p表示如果有"$dirname",就不创建了,不然会多一条提醒。
因为后续可能需要根据错误信息,将没有放入的视频进行手动分类,所以错误信息简洁一些较好
mv -nv表示如果目标文件存在,那么就不覆盖写入了。返回信息如下:
% test.sh
作者/2024-05-22.mp4 not overwritten
本文主要是适合我的情况,仅供参考。
希望能帮到有需要的人~
1771

被折叠的 条评论
为什么被折叠?



