我目前正在使用bash-shell脚本,使用FFMPEG将所有Plex DVR记录编码为H.264。我正在使用我在网上找到的这个小for循环来将所有文件编码在一个目录中:
for i in *.ts;
do echo "$i" && ffmpeg -i "$i" -vf yadif -c:v libx264 -preset veryslow -crf 22 -y "/mnt/d/Video/DVR Stash/Seinfeld/${i%.*}.mp4";
done
这很好地达到了它的目的,但在这个过程中,我想将文件重命名为我喜欢的命名约定,以便在编码文件中将原始文件名Seinfeld (1989) - S01E01 - Pilot.ts
重命名为Seinfeld S01 E01 Pilot.mp4
。虽然我已经在使用正则表达式将.ts
扩展名更改为.mp4
,但我不是regex的专家,尤其是在bash shell中,所以如果有任何帮助,我将不胜感激。
对于任何对我的Plex设置感兴趣的人来说,我使用一台运行Linux Mint的旧机器作为我的专用DVR,并通过我的日常驱动程序(一台游戏机(通过网络访问它,因此视频编码的处理能力更强。虽然那是一台Windows机器,但我使用WSL2下的Ubuntu bash来运行我的脚本,因为我更喜欢它而不是Windows命令提示符或Powershell(我的日常工作是在公司发行的Mac上担任网络开发人员(。因此,这里有一个我的代码示例,供任何可能考虑做类似事情的人使用。
if [[ -d "/mnt/sambashare/Seinfeld (1989)" ]]
then
cd "/mnt/sambashare/Seinfeld (1989)"
echo "Seinfeld"
for dir in */; do
echo "$dir/"
cd "$dir"
for i in *.ts;
do echo "$i" && ffmpeg -i "$i" -vf yadif -c:v libx264 -preset veryslow -crf 22 -y "/mnt/d/Video/DVR Stash/Seinfeld/${i%.*}.mp4";
done
cd ..
done
fi
虽然我已经考虑过为所有节目做一个for循环,但现在我正在单独做每个这样的节目,因为有一些节目我有的自定义编码设置
使用extglob 对代码进行一个小的修订,类似于这样
#!/usr/bin/env bash
if [[ -d "/mnt/sambashare/Seinfeld (1989)" ]]; then
cd "/mnt/sambashare/Seinfeld (1989)" || exit
echo "Seinfeld"
for dir in */; do
echo "$dir/"
cd "$dir" || exit
for i in *.ts; do
shopt -s extglob
new_file=${i//@( (*)|- )}
new_file=${new_file/E/ E}
new_file=${new_file%.*}
echo "$i" &&
ffmpeg -i "$i" -vf yadif -c:v libx264 -preset veryslow -crf 22 -y "/mnt/d/Video/DVR Stash/Seinfeld/${new_file}.mp4"
shopt -u extglob
done
cd ..
done
fi
如果文件名中除了剧集之外还有E
,那么string/glob/pattern切片可能会失败。
对于扩展正则表达式使用=~
运算符的BASH_REMATCH
。即使文件名中有更多的E
,这也会起作用。
#!/usr/bin/env bash
if [[ -d "/mnt/sambashare/Seinfeld (1989)" ]]; then
cd "/mnt/sambashare/Seinfeld (1989)" || exit
echo "Seinfeld"
for dir in */; do
echo "$dir/"
cd "$dir" || exit
for i in *.ts; do
regex='^(.+) ((.+)) - (S[[:digit:]]+)(E[[:digit:]]+) - (.+)([.].+)$'
[[ $i =~ $regex ]] &&
new_file="${BASH_REMATCH[1]} ${BASH_REMATCH[3]} ${BASH_REMATCH[4]} ${BASH_REMATCH[5]}"
echo "$i" &&
ffmpeg -i "$i" -vf yadif -c:v libx264 -preset veryslow -crf 22 -y "/mnt/d/Video/DVR Stash/Seinfeld/${new_file}.mp4"
done
cd ..
done
fi
- 添加了一个
cd ... || exit
,只是为了确保在尝试cd
到某个位置时出现错误时脚本停止/退出,而不是继续脚本