首页 > 解决方案 > 重命名脚本以调整 debian 中文件名中的某些模式

问题描述

我目前有点卡住,如果文件夹树中的文件名具有以下一项或两项,则尝试调整它们:

  1. 删除 'S00' - 'S99' - 这部分将被从文件名中删除。 s/[sS](0[1-9]|[1-9][0-9])/我认为可以这样做

  2. 任何独立的两位数前面都有一个“E”。以某种方式查找/\b([0-9]{2})\b/和替换E$1

示例:任何这些

改为

在各自的子文件夹中。

最终目标是在文件出现时自动化重命名文件的过程(后一点我必须在完成此操作后弄清楚),以便 kodi scraper 可以识别剧集

正如你所看到的,这就是我所取得的进展,它仍然是一团糟,因为我不久前在这里找到了这个重命名脚本,但我不知道如何正确应用正则表达式,我只是把它拍了进去

#!/bin/bash

start_dir="//srv/MEDIA2/"
find "$start_dir" -name '*.*' -type f \
  |sort \
  |while read name; do 
     ((i++))
     mv -i "$name" \
#remove season part
       "$(printf 's/[sS](0[1-9]|[1-9][0-9])/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
#prepend E to free standing double digits
       "$(printf 's/\b([0-9]{2})\b/' "$(dirname "$name")" $((i)) "$(basename "$name")")"
    
done

目前它返回

//home/user/./rnscript.sh: line 14: s/[sS](0[1-9]|[1-9][0-9])/: No such file or directory
//home/user/./rnscript.sh: line 16: s([0-9]{2}/: No such file or directory

如果有该领域的专业知识的人可以帮助我完成这项工作,将不胜感激。

标签: regexlinuxbashrename

解决方案


请您尝试以下方法:

#!/bin/bash

shopt -s globstar

start_dir="//srv/MEDIA2/"                       # double // may be meaningless
for name in "$start_dir"/**/*.*; do             # search the directory recursively
    [[ -f $name ]] || continue                  # skip if "$name" is not a file
    newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) +//; s/\b([0-9]{2})\b/E\1/' <<< "$name")
    if [[ "$name" != "$newname" ]]; then        # skip if the filenames are the same
         echo mv -- "$name" "$newname"
    fi
done

echo如果输出看起来不错,则丢弃。
我们不必对文件进行排序,因为$i没有使用该变量。

[编辑]

如果您也想更改S04E02E02,请将newname=上面的行替换为:

newname=$(sed -E 's/[sS](0[1-9]|[1-9][0-9]) *//; s/\b([0-9]{2})\b/E\1/' <<< "$name")

区别只是更改+*,表示零个或多个空格。


推荐阅读