【问题标题】:rename script to adjust certain patterns within a filename in debian重命名脚本以调整 debian 中文件名中的某些模式
【发布时间】:2021-07-12 03:37:58
【问题描述】:

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

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

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

示例: 这些中的任何一个

  • [lorem ipsum] dolor sit amet 07 [consetetur][1080p].mkv

  • [lorem ipsum] dolor sit amet S04 07 [consetetur][1080p].mkv

  • [lorem ipsum] dolor sit amet S04 E07 [consetetur][1080p].mkv

改为

  • [lorem ipsum] dolor sit amet E07 [consetetur][1080p].mkv

在它们各自的子文件夹中。

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

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

#!/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

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

【问题讨论】:

  • 增量变量$i的作用是什么?
  • 我最初认为它是为了在重命名后保持运行,直到它以这种方式检查所有文件。但现在我意识到这是另一个脚本的剩余部分,该脚本旨在为名称添加数字计数。啊鲤鱼好吧,这比我想象的还要混乱

标签: regex linux bash rename


【解决方案1】:

请您尝试以下方法:

#!/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

[编辑]

如果您还想将S04E02 更改为E02,请将上面的newname= 行替换为:

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

区别只是将+ 更改为*,意思是零个或多个空格。

【讨论】:

  • 哦,它确实有效!太感谢了!它为每个跳过的文件返回这个,但我不介意。 mv: '//srv/MEDIA2/dateien2//youtube-icon.png' and '//srv/MEDIA2/dateien2//youtube-icon.png' are the same file
  • 好的一个问题,似乎无法看到名称中带有空格的子文件夹,这可能吗?
  • 感谢您的反馈。您能否详细说明导致问题的路径名?我将一次性解决“相同文件”问题。
  • 再次检查,我认为它只检查链接文件夹本身,而没有检查子文件夹。
  • 我已经用支持S04E02 表达式类型的代码更新了我的答案。
猜你喜欢
  • 2017-09-15
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2016-11-30
  • 2020-01-27
  • 2018-03-06
相关资源
最近更新 更多