首页 > 解决方案 > 最佳 Linux 脚本;将 SRT 重命名为同一文件夹中电影文件的名称;多个子文件夹

问题描述

已经多次尝试回答这个问题,但找不到正确的脚本。

问题:除非与电影同名,或与电影同名 +.en.srt 或 .es.srt 或 .fr.srt 等,否则无法加载 SRT 字幕。

主电影目录中的 1000 多个电影目录在它们各自的电影目录中,有时包含 1+ 个 .srt 文件(1_English.srt、2_English.srt、*French.srt 等)。

我的媒体服务器使用的是 Ubuntu,所以解决方案应该使用 BASH 脚本。

这是我的文件结构的片段:

Test-dir$ tree
.
├── renamer.sh
├── Saga.of.the.Phoenix.1990.1080p
│   ├── 1_French.srt
│   ├── 1_Spanish.srt
│   ├── 2_English.srt
│   ├── 3_English.srt
│   └── Saga.of.the.Phoenix.1990.1080p.BluRay.x265.mp4
├── Salt.and.Pepper.1968.1080p
│   ├── 1_French.srt
│   ├── 1_Spanish.srt
│   ├── 2_English.srt
│   ├── 4_English.srt
│   └── Salt.and.Pepper.1968.1080p.mp4
└── Salyut-7.2017.1080p.BluRay.x265
    ├── 2_English.srt
    └── Salyut-7.2017.1080p.BluRay.x265.mp4

问题:在编写 BASH 脚本时,

  1. 有多个相同语言的srt文件,我通常喜欢选择较大的文件并删除较小的文件,脚本的第一部分必须对相同语言的srt进行排序并删除较小的文件,如何编写脚本?
  2. 如何将 srt 的名称更改为与电影文件相同的名称(不总是 mp4,有时是 mkv 或 avi。),同时附加语言的首字母缩略词(en、es、fr、ru、..)如果 English.srt 那么将名称更改为“MovieName”.en.srt?

我已经启动脚本从电影目录的 SUB 目录中删除 srt 文件,然后删除 SUB 目录。

此外,添加了一个脚本来删除电影字符串中任何不需要的部分,或删除不需要的文件。

#!/bin/bash/

# Using current working DIR of where script is ran from
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# Moves srt files from SUB folders to their movie folder.
for i in */Subs; do
     mv "$i"/* "$i"/..
done

# Removes Subs directory.
find $DIR/* -type d -name "Subs" -exec rm -rf {} +

# Removing the additional rar string from the folders and their movie names.
find . -depth -name '*-rar*' -execdir bash -c 'for f; do mv -i "$f" "${f//-rar/}"; done' bash {} +

# Removing unwanted files from all movie folders.
find . -maxdepth 2 -type f \( -name "RAR.txt" -o -name "RAR.nfo" \) -delete

######## Your helper code starts from here to answer questions 1 and 2 #####################

非常感谢您帮助解决这个难题,这不仅会帮助一个人,而且会帮助许多人,让我们通过一个脚本来释放数小时的复制、删除、粘贴以及所有这些。

更新:BTB91 给出了一个绝妙的答案并且已经奏效,但是为了帮助其他人学习解决上述相同问题的多种方法,我想保持这个线程开放。

标签: linuxbash

解决方案


IFS=$'\n' eval "MOVS=(\$( find \"\$DIR\" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' ))" # list of movies
for M in "${MOVS[@]}" ; do
    cd "$DIR/$M"
    IFS=$'\n' eval "LANGS=(\$( ls | sed -nr 's/.*_([[:alpha:]]+).srt/\1/p' | sort -u ))" # list of languages for movie
    for L in "${LANGS[@]}" ; do
        IFS=$'\n' eval "FILES=(\$( ls -S *_$L.srt))" # list files for language sorted by size
        case "${L,,}" in
            en*)
                L=en
                ;;
            sp*|es*)
                L=es
                ;;
        esac
        mv -v "${FILES[0]}" "$M.$L.srt"
        FILES[0]=
        rm -vf "${FILES[@]}"
    done
    cd "$OLDPWD"
done

我使用 "IFS=$'\n' eval ..." 因为目录或文件名可能包含空格。


推荐阅读