这是我在StackOverflow上的第一篇文章,请温柔点。:)
我有一个Linux服务器,我会下载电视节目并手动将文件移动到它们各自的文件夹中,以便我的Plex服务器利用。我想自动化这个过程。我已经做到了以下这一步。
文件命名规则 Show.Name.SeasonNumberEpisodeNumber.HDTV.X264.etc...
例如:Almost.Human.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或正则表达式,无法正确使用语法。经过多次搜索,没有人在任何示例中做到这一点,我可以“借鉴”。
提前感谢!
更新
非常感谢Janos!他不仅提供了一个很好的解决方案,还帮助我更好地理解了使用正则表达式的方法。
我对最终产品进行了一些更改。经过了解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 - S\2E\3.mkv?')"
if [ ! -f "$dfile" ]
then
cp -v "$file" "$dfile"
mkdir -p "$(dirname "$dfile")"
else
echo "file exists "$dfile""
fi
done