linux - 最佳 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 脚本时,
- 有多个相同语言的srt文件,我通常喜欢选择较大的文件并删除较小的文件,脚本的第一部分必须对相同语言的srt进行排序并删除较小的文件,如何编写脚本?
- 如何将 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 给出了一个绝妙的答案并且已经奏效,但是为了帮助其他人学习解决上述相同问题的多种方法,我想保持这个线程开放。
解决方案
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 ..." 因为目录或文件名可能包含空格。
推荐阅读
- three.js - GLTF 模型在three.js 中旋转时变形
- excel - 如何从多个工作表中过滤每个唯一值并将它们粘贴到与单元格中的值同名的新工作表或现有工作表中?
- apache-spark - python的火花流在databricks中不起作用
- javascript - Javascript 中最长的公共前缀
- python - 在pyfcm中推送通知后无法在firebase控制台中找到通知
- python - 缓慢的刮擦和不拉动线程中的所有页面 - 需要帮助
- unity3d - 创建 3D 轴以移动对象(在 Unity 中)
- cucumber - 是否有任何用于维护和管理黄瓜功能文件的最佳 JIRA 服务器插件/应用程序?
- html - 使 flex-box 中的元素占用动态空间量(如果两个元素,则为 50%,如果三个元素,则为 33%,等等)
- javascript - 如何使用相对于画布的 x、y 坐标在画布上绘图