批量重命名媒体文件

批量重命名媒体文件

我有一台 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}"

重命名该文件。

相关内容