我有一个Enigma2 FreeSat记录器,现在我已经连接到我的Plex媒体服务器上。
Plex可以很好地看到和播放来自Enigma2的文件,但是文件命名没有吸引力。
如何重命名这种格式的文件:
yyyymmdd nnnn - channel - title.*,例如20181128 2100年- BBC One HD -学徒。*
至:
title - dd-mm-yyyy - channel.*例如“学徒”- 28-11-2018 - BBC One HD。*
(以这种方式,我可以每隔几分钟从命令行运行一次)。
我希望确保它只匹配第一种格式的文件,这样它就不会尝试重命名已经重命名的文件。
稍后,我想让它作为一个码头容器运行。
发布于 2018-11-30 17:13:05
您可以将此作为起点:
#!/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“,这样它就可以筛选出与此字符串不匹配的任何内容。然后,对于读取的每一行(可以是find(1)、ls(1)等的输出),它会检查该正则表达式是否匹配。如果是这样,则跳到下一行。
下一组变量赋值是获取所需的各种组件。下一个任务是获得文件扩展名。yyyymmdd得到的是年度,月和日。然后,通过使用变量子字符串重新格式化。
由于通道和标题是用破折号分隔的,我认为使用awk(1)来获得适当的字段会更容易。sed将在字符串之前和之后修剪任何空格。最后一个标题是删除文件扩展名。
一旦有了所有变量,就打印出这一行。这可以很容易地用
mv ${l} "${title} - ${yyyymmdd} - ${channel}.${ext}"来重命名文件。
发布于 2018-11-30 17:48:32
我认为下面的think脚本可以做到这一点。
它将检查原始文件名的日期和时间是否为数字,如果是,则将名称重新排列为首选格式。
否则,该文件将被跳过,因此已经修改的文件将不会被触摸。
将目录更改为文件所在的位置并运行脚本。
#!/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
donehttps://unix.stackexchange.com/questions/485173
复制相似问题