我目前在运行 ubuntu 的 Beelink 上运行 plex,到目前为止,与每部电影相关的所有文件(电影文件、相关图像和字幕)都在同一个父目录中。大多数情况下这没问题,但对于有多个字幕的电影,可能会变得混乱。例如
/Movies
/Avatar (2009)
Avatar (2009).mkv
Avatar (2009).eng.srt
Avatar (2009).en.forced.ass
Avatar (2009).en.sdh.srt
Avatar (2009).de.srt
Avatar (2009).de.sdh.forced.srt
现在看来 plex 会在“subs”或“subtitles”文件夹中找到字幕位置。那么为了整理一下,我该如何递归遍历父电影目录,并针对每个单独的电影文件夹,将所有字幕文件移动到“subtitles”文件夹中,就像这样?
/Movies
/Avatar (2009)
Avatar (2009).mkv
/Subtitles
Avatar (2009).eng.srt
Avatar (2009).en.sdh.srt
Avatar (2009).de.srt
Avatar (2009).de.sdh.forced.srt
对于电视节目,父文件夹下可能有多个级别,例如
**Old:**
/TV Shows
/Game Of Thrones
/Season 02
Game Of Thrones - s02e03.mp4
Game Of Thrones - s02e03.eng.srt
Game Of Thrones - s02e03.en.forced.srt
**New:**
TV Shows
/Game Of Thrones
/Season 01
Game Of Thrones - s01e03.mp4
Game Of Thrones - s01e04.mp4
/Subtitles
Game Of Thrones - s01e03.eng.srt
Game Of Thrones - s01e04.eng.srt
/Season 02
Game Of Thrones - s02e03.mp4
/Subs
Game Of Thrones - s02e03.eng.srt
Game Of Thrones - s02e03.en.forced.srt
更好的选择是仅当尚未在字幕文件夹中时才移动......
.srt
将以递归方式查找当前工作目录中每个文件的路径,排除名为“Subtitles”的目录中包含的文件,仅打印其基本名称并过滤掉重复项,在每个结果路径内创建一个“Subtitles”目录(如果不存在)并移动.srt
其中每个文件。它将处理
.srt
位于当前工作目录任何深度的文件,以及“电视节目”目录。该命令将执行试运行;如果输出看起来不错,则运行实际命令:
这是另一种方法。使用 bash 的
globstar
选项允许递归到子目录中。来自man bash
:因此
**/
只会匹配目录,但会包含子目录。考虑到这一点,你可以这样做:我使用以下一组文件和目录对其进行了测试:
运行上述命令后,我得到以下结果:
请注意,如果目录中没有 srt 文件,它会抛出一些警告,因为它会尝试运行,
mv directory_name/*srt directory_name/Subtitles
但由于*.srt
glob 不匹配任何内容,它会返回自身(除非您nullglob
激活了该选项),并且由于没有文件名称为*srt
,它会失败。这也是我必须添加rmdir **/Subtitles
删除空Subtitles
目录的原因。您可以安全地添加2> /dev/null
到命令末尾mv
以隐藏这些警告。或者,您可以做一些稍微复杂一点的事情,并且只创建目录并在您知道有
*.srt
文件时尝试复制:这样一次传递就能得到所需的输出。为了避免移动已经在
Subtitles
目录中的文件,请使用extglob
bash 选项,该选项允许您构建更复杂的 glob,并查找名称不是 的任何目录Subtitles
: