1

我确信这已经被回答过,但我似乎无法使用正确的搜索词来找到它。

我正在尝试编写一个 bash 脚本,该脚本可以根据文件名称中的模式识别、排序和重命名文件。

取这个文件名,例如:BBC Something Something 3 of 5 Blah 2007.avi

我希望脚本能够识别,因为文件名以 BBC 开头并包含与模式“DIGIT of DIGIT”匹配的内容,脚本应该通过删除前面的 BBC 来重命名它,在前面插入字符串“s01e0” 3,去掉“of 5”,把它变成Something Something s01e03 Blah 2007.avi

此外,我希望脚本能够以不同方式识别和处理名为BBC Something Else 2009.mkv的文件。在这种情况下,我需要脚本来识别由于文件名以 BBC 开头并以年份结尾,但不包含“DIGIT of DIGIT”模式,它应该通过在 BBC 之后插入单词“documentaries”来重命名它,然后之后的一年复制粘贴,这样文件名就变成了BBC 纪录片 2009 Something Else.mkv

我希望这不是需要太多帮助......我自己整天都在研究这个,但这就是我所拥有的一切:

topic1 () {
if [ "$2" = "bbc*[:digit:] of [:digit:]" ]; then

然后什么都没有。我很想得到一些帮助!谢谢!

4

1 回答 1

2

用于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]- 匹配文字“ of”和数字,
  • \(.*\)- 匹配休息并在捕获组 3 中记住它

然后把它们放在我们想要的位置:

  • \1- 捕获组 1 的内容,即“BBC”和第一位数字之间的所有内容
  • s01e0- 文字“s01e0”
  • \2- 捕获组 2 的内容,即剧集编号
  • \3- 捕获组 3 的内容,即其他所有内容

这可能会导致许多多余的空间,所以最后有另一个sed调用来清理它。

于 2013-10-25T00:31:03.117 回答