Regex 重命名脚本以调整debian文件名中的某些模式

Regex 重命名脚本以调整debian文件名中的某些模式,regex,linux,bash,rename,Regex,Linux,Bash,Rename,我现在有点卡住了,试图调整文件夹树中的文件名,如果它们有以下一个或两个: #!/bin/bash shopt -s globstar start_dir="//srv/MEDIA2/" # double // may be meaningless for name in "$start_dir"/**/*.*; do # search the directory recursively

我现在有点卡住了,试图调整文件夹树中的文件名,如果它们有以下一个或两个:

#!/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
  • 删除“S00”-“S99”-该部分将从文件名中删除。
    s/[sS](0[1-9]|[1-9][0-9])/
    我认为可以做到这一点

  • 任何独立的两位数前面都会有一个“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
    

    如果在该领域拥有专业知识的任何人都能帮助我运行此系统,我们将不胜感激。

    请尝试以下方法:

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

    区别在于将
    +
    更改为
    *
    ,这意味着零个或更多的空格。

    增量变量
    $i
    的目的是什么?我最初认为它是为了在重命名后保持运行,直到它以这种方式检查所有文件为止。但现在我意识到这是另一个脚本的遗留,该脚本旨在为名称添加数字计数。啊,鲤鱼,好吧,这比我想象的还要糟糕哦,它确实有用!!!非常感谢你!它会为每个跳过的文件返回这个,但我不介意
    mv:'//srv/MEDIA2/dateien2//youtube-icon.png'和'//srv/MEDIA2/dateien2//youtube-icon.png'是同一个文件
    ok一个问题,似乎无法看到名称中带有空格的子文件夹。这可能吗?感谢您的反馈。您能否详细说明导致问题的路径名?我将一次性修复“同一文件”问题。再次检查,我认为它只检查链接文件夹本身,而不检查子文件夹。我已使用支持
    S04E02
    表达式类型的代码更新了我的答案。