我确信之前已经回答过,但我似乎无法使用正确的搜索字词来查找它。
我正在尝试编写一个bash脚本,可以根据名称中的模式识别,排序和重命名文件。
取这个文件名,例如: BBC Something Something of 3 Blah 2007.avi
我希望脚本能够识别出,因为文件名以BBC开头并且包含与“DIGIT of DIGIT”相匹配的内容,脚本应该通过删除前面的BBC来重命名它,插入字符串“s01e0” 3的前面,删除“5”,把它变成 Something Something s01e03 Blah 2007.avi
此外,我希望脚本能够识别和处理一个名为的文件,例如 BBC Something Else 2009.mkv 。在这种情况下,我需要脚本识别,因为文件名以BBC开头并以一年结束,但不包含那个“DIGIT of DIGIT”模式,它应该通过插入单词重命名BBC之后的“纪录片”,然后在那之后复制和粘贴一年,以便文件名变成 BBC纪录片2009 Something Else.mkv
我希望这不是要求太多的帮助......我整天都在努力做这件事,但这实际上就是我所拥有的一切:
topic1 () {
if [ "$2" = "bbc*[:digit:] of [:digit:]" ]; then
然后什么都没有。我很乐意帮忙!谢谢!
答案 0 :(得分:1)
使用grep
来匹配需要更改的文件名,然后使用sed
来实际更改它们:
#!/bin/bash
get_name()
{
local FILENAME="${1}"
local NEWNAME=""
# check if input matches our criteria
MATCH_EPISODE=$(echo "${FILENAME}" | grep -c "BBC.*[0-9] of [0-9]")
MATCH_DOCUMENTARY=$(echo "${FILENAME}" | grep -c "BBC.*[0-9]\{4\}")
# if it matches then modify
if [ "${MATCH_EPISODE}" = "1" ]; then
NEWNAME=$(echo "${FILENAME}" | sed -e 's/BBC\(.*\)\([0-9]\) of [0-9]\(.*\)/\1 s01e0\2 \3/')
elif [ "${MATCH_DOCUMENTARY}" = "1" ]; then
NEWNAME=$(echo "${FILENAME}" | sed -e 's/BBC\(.*\)\([0-9]\{4\}\)\(.*\)/BBC documentaries \2 \1 \3/')
fi
# clean up: remove trailing spaces, double spaces, spaces before dot
echo "${NEWNAME}" | sed -e 's/^ *//' -e 's/ / /g' -e 's/ \./\./g'
}
FN1="BBC Something Something 3 of 5 Blah 2007.avi"
FN2="BBC Something Else 2009.mkv"
FN3="Something Not From BBC.mkv"
NN1=$(get_name "${FN1}")
NN2=$(get_name "${FN2}")
NN3=$(get_name "${FN3}")
echo "${FN1} -> ${NN1}"
echo "${FN2} -> ${NN2}"
echo "${FN3} -> ${NN3}"
输出结果为:
BBC Something Something 3 of 5 Blah 2007.avi -> Something Something s01e03 Blah 2007.avi
BBC Something Else 2009.mkv -> BBC documentaries 2009 Something Else.mkv
Something Not From BBC.mkv ->
让我们看一下sed
次调用:
sed -e 's/BBC\(.*\)\([0-9]\) of [0-9]\(.*\)/\1 s01e0\2 \3/'
我们使用捕获组来匹配文件名的有趣部分:
BBC
- 匹配文字广告BBC,\(.*\)
- 匹配所有内容并在捕获组1中记住它,直到\([0-9]\)
- 一个数字,记住它在捕获组2中,然后of [0-9]
- 匹配文字" "和数字,\(.*\)
- 匹配休息并在捕获组3中记住它然后将它们放在我们想要的位置:
\1
- 捕获组1的内容,即BBC和#34;之间的所有内容。和第一个数字s01e0
- 字面意思" s01e0" \2
- 捕获组2的内容,即剧集编号\3
- 捕获组3的内容,即其他所有内容这可能导致许多多余的空格,所以最后还有另一个sed
调用来清理它。