命令行如何批量将“作者-标题-日期”名称格式的文件放入到对应的“作者”目录下

最近归档下载视频的时候,发现下载文件名设置成作者-标题-日期.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或者更大的也行):

后面需要使用mkdirmv,而不是rename -p,因为为了防止作者或者名称中有空格,让 Shell 拆分命令,需要给变量加上双引号。

mkdir -p表示如果有"$dirname",就不创建了,不然会多一条提醒。

因为后续可能需要根据错误信息,将没有放入的视频进行手动分类,所以错误信息简洁一些较好

mv -nv表示如果目标文件存在,那么就不覆盖写入了。返回信息如下:

% test.sh  
作者/2024-05-22.mp4 not overwritten

本文主要是适合我的情况,仅供参考。

希望能帮到有需要的人~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值