这是我在StackOverflow上的第一篇文章。要温柔。:)
我有一个 linux 服务器,我将电视节目下载到该服务器,并手动将文件移动到各自的文件夹中供我的 Plex 服务器使用。我想自动化这个过程。我已经走到了下面。
文件命名约定显示.名称.季号剧集编号.高清电视.X264.etc...
示例:几乎.人类.S01E01.720p.HDTV.X264.mkv
注意:节目名称可以是不同的长度,名称中的每个单词之间都有一个 . 。
我能够从文件名中提取显示文件夹名称。
#!/bin/bash
readonly FILEPATH=~/downloads
readonly SAVEPATH=~/shows
for file in $FILEPATH/*.mkv
do
#Get foldername from filename (everything before .S0 is foldername
foldername=$(basename "${file%.S0*}" | tr '.' ' ')
#Need to convert extracted season info into folder name ex. S01 = Season 1
# seasonfolder=$(basename "${file}" | sed -e 's/^[^S0]*//;')
#Copy the file to the path we built.
#Auto-create folder if it doesn't exist?
# cp $file "$SAVEPATH/$foldername/#seasonfolder"
done
问题:
- 我还想从文件名中提取季节信息 并使用它来构建文件夹路径的其余部分。每个文件都有一个 我可以用来获取赛季信息的 SxxExx 部分。我会 例如,将 S01 转换为第 1 季以成为文件夹的一部分 路径。
生成的复制命令看起来像这样(使用上面的文件名)
cp Almost.Human.S01E01.720p.HDTV.X264.mkv shows/Almost Human/Season 1
我对 sed 或正则表达式不够精通,无法获得正确的语法和 经过大量搜索,没有人在任何示例中都这样做 可以"借"用。
提前感谢!
更新
非常感谢亚诺斯!他不仅提供了一个出色的解决方案,而且还帮助我吸收了更多关于使用正则表达式的知识。
我对最终产品进行了一些更改。在对 Plex 的命名约定要求进行了一些研究之后,我调整了正则表达式以适应并内置了"文件存在"检查以避免不必要的传输。
这是我今晚晚些时候将添加到 CRON 的最终结果。
#!/bin/bash
readonly FILEPATH=~/downloads
readonly SAVEPATH=~/shows
for file in $FILEPATH/*.mkv
do
dfile="$SAVEPATH/$(basename "$file" | sed -e 's/./ /g' -e 's?(.*) [Ss]([0-9][0-9])[Ee]([0-9][0-9]) .*?1/Season 2/1 - S2E3.mkv?')"
if [ ! -f "$dfile" ]
then
cp -v "$file" "$dfile"
mkdir -p "$(dirname "$dfile")"
else
echo "file exists "$dfile""
fi
done
你可以做这样的事情:
for file in $FILEPATH/*.mkv; do
# get the destination filename
dfile="$SAVEPATH/$(basename "$file" | sed -e 's/./ /g' -e 's?(.*) S0([0-9])E([0-9][0-9]) .*?1/Season 2/Episode 3.mkv?')"
# create the destination directory
mkdir -p "$(dirname "$dfile")"
cp "$file" "$dfile"
done
这将创建如下文件名:
Almost Human/Season 1/Episode 01.mkv
要使文件名如下所示:
Almost Human/Season 1/Almost Human Episode 01.mkv
然后像这样更改sed
:
sed -e 's/./ /g' -e 's?(.*) S0([0-9])E([0-9][0-9]) .*?1/Season 2/1 Episode 3.mkv?
此解决方案的关键是在(...)
中捕获名称的相关部分,然后使用1
对第一个(...)
引用这些捕获的匹配项,对第二个2
引用,依此类推。