我有一台 Enigma2 FreeSat 录音机,现已连接到我的 Plex 媒体服务器。
Plex 可以很好地查看和播放 Enigma2 中的文件,但文件命名使其缺乏吸引力。
如何重命名这种格式的文件:
yyyymmdd nnnn - channel - title.*
例如 20181128 2100 - BBC One HD - 学徒。*
到:
title - dd-mm-yyyy - channel.*
例如《学徒》- 2018 年 11 月 28 日 - BBC One HD。*
(这样我就可以从命令行每隔几分钟运行一次)。
我想确保它只匹配第一种格式的文件,这样它就不会尝试重命名已经重命名的文件。
稍后我希望将其作为 Docker 容器运行。
答案1
我认为下面的 shellscript 可以做到这一点。
它将检查原始文件名的日期和时间是否为数字,如果是数字,则将名称重新排列为首选格式。
否则该文件将被跳过,因此已经修改的文件将不会被触及。
将目录更改为文件所在位置并运行脚本。
#!/bin/bash
re='^[0-9]+$'
for i in *.*
do
str="$i"
# echo "${str} -----"
date=${str:0:8}
time=${str:9:4}
if [[ $date =~ $re ]] && [[ $time =~ $re ]]
then
channel=${i#*- }
channel=${channel% -*}
title=${i##*- }
ext=${title##*.}
title=${title%%.*}
date=${date:6:2}-${date:4:2}-${date:0:4}
mv -nv "$i" "$title - $date - $channel.$ext"
fi
done
答案2
您可以使用它作为起点:
#!/bin/bash
regexp='^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] -'
while read l; do
[[ ! ${l} =~ ${regexp} ]] && continue
ext=${l##*.}
yyyymmdd=${l%% *}
yyyymmdd="${yyyymmdd:6:2}-${yyyymmdd:4:2}-${yyyymmdd:0:4}"
channel=$(echo ${l} | awk -F- '{print $2}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=$(echo ${l} | awk -F- '{print $NF}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=${title%.*}
echo "${title} - ${yyyymmdd} - ${channel}.${ext}"
done
exit 0
这会将您的正则表达式设置为“yyyymmdd nnnn -”,以便它可以过滤掉任何与该字符串不匹配的内容。然后,对于读入的每一行(可能是 find(1)、ls(1) 等的输出),它会检查该正则表达式是否匹配。如果是,则跳到下一行。
下一组变量分配将获取您想要的各种组件。 ext 赋值正在获取文件扩展名。 yyyymmdd 获取年、月和日。然后使用可变子字符串重新格式化。
由于频道和标题由破折号分隔,我认为使用 awk(1) 来获取适当的字段会更容易。之后的 sed 将修剪字符串前后的所有空格。最后一个标题是删除文件扩展名。
获得所有变量后,打印出该行。这可以很容易地替换为
mv ${l} "${title} - ${yyyymmdd} - ${channel}.${ext}"
重命名该文件。