怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
asean
帖子: 164
注册时间: 2012-09-23 13:19
系统: ubuntu 12.04

怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?

#1

帖子 asean » 2015-12-30 14:13

例如 视频名字满足 *EP xx*.mkv的通配符, 字幕满足 *EP xx*.srt, (xx是数字),但是视频和字幕的*部分是不一样的,怎么把同一集的字幕名改成跟对应视频同名啊?
我曾经在java下用listfiles 以及正则表达式 实现了这个功能,但是感觉用java代码实现这个有点麻烦,想用类shell的脚本来做,但是我不大懂shell写法,求助各位大神!
上次由 asean 在 2015-12-30 16:38,总共编辑 1 次。
头像
duguyipiao
帖子: 158
注册时间: 2011-09-13 10:31

Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名?

#2

帖子 duguyipiao » 2015-12-30 14:31

可能不需要用shell脚本,用rename命令就可以,用法好像和sed差不多。可以man rename看一下。
头像
asean
帖子: 164
注册时间: 2012-09-23 13:19
系统: ubuntu 12.04

Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名?

#3

帖子 asean » 2015-12-30 16:37

duguyipiao 写了:可能不需要用shell脚本,用rename命令就可以,用法好像和sed差不多。可以man rename看一下。
不不,我觉得至少得要一个for循环把,因为视频名字是不规则的。。。比如 EP1 abcd.mkv EP2 efgh.mkv ... ,我要把对应的srt,比如 EP1 xyza.srt重命名为 EP1 abcd.srt
所以首先得得到匹配一个 *EP xx*.mkv的文件的字符串,看到一个fnmatch.filter的用法好像行,但是是python,,,虽然跟shell也差不多啦
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?

#4

帖子 susbarbatus » 2015-12-30 18:26

题目没说明清楚,我就假设一种最简单的情况了。
如果 EP 后面的数字是连续不重复的(例如 1 到 12),那么应该这样就行了:

代码: 全选

for i in {1..12}; do TARGET=(*EP${i}*.mkv) ; mv *EP${i}*.srt "${TARGET%mkv}srt" ; done
沉迷将棋中……
头像
asean
帖子: 164
注册时间: 2012-09-23 13:19
系统: ubuntu 12.04

Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?

#5

帖子 asean » 2015-12-30 18:54

susbarbatus 写了:题目没说明清楚,我就假设一种最简单的情况了。
如果 EP 后面的数字是连续不重复的(例如 1 到 12),那么应该这样就行了:

代码: 全选

for i in {1..12}; do TARGET=(*EP${i}*.mkv) ; mv *EP${i}*.srt "${TARGET%mkv}srt" ; done
多谢大神,就是我想要的样子~
我之前也自己尝试写shell,但是在类似于你的TARGET=(*EP${i}*.mkv) ;这一步死都过不去, 然后才发现 原来 '=' 跟 '('之间是不能有空格的!!我真是日了狗了
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?

#6

帖子 susbarbatus » 2015-12-30 19:57

回头来看貌似有点问题…
如果真的是 1 到 12,*EP1* 会匹配到 EP1、EP10、EP11 和 EP12 的,于是以上只对数字位数相同的情况有效,比如 01..12 这样类型的,或者干脆只有 1..9 集的。

改成这样可以解决这个问题:

代码: 全选

for i in {1..12}; do TARGET=(*EP${i}[^0-9]*.mkv) ; mv *EP${i}[^0-9]*.srt "${TARGET%mkv}srt" ; done
但改成这样之后要求 EP1 之后必须有至少一个非数字字符,假如文件名是 'abc EP1.srt' 之类的就匹配不到了,
把这种情况也覆盖进来也是可以的,但是这样出来的语句就太罗嗦了懒得写了…
沉迷将棋中……
头像
asean
帖子: 164
注册时间: 2012-09-23 13:19
系统: ubuntu 12.04

Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?

#7

帖子 asean » 2015-12-30 20:02

susbarbatus 写了:回头来看貌似有点问题…
如果真的是 1 到 12,*EP1* 会匹配到 EP1、EP10、EP11 和 EP12 的,于是以上只对数字位数相同的情况有效,比如 01..12 这样类型的,或者干脆只有 1..9 集的。

改成这样可以解决这个问题:

代码: 全选

for i in {1..12}; do TARGET=(*EP${i}[^0-9]*.mkv) ; mv *EP${i}[^0-9]*.srt "${TARGET%mkv}srt" ; done
但改成这样之后要求 EP1 之后必须有至少一个非数字字符,假如文件名是 'abc EP1.srt' 之类的就匹配不到了,
把这种情况也覆盖进来也是可以的,但是这样出来的语句就太罗嗦了懒得写了…
嗯我也想到了这个问题,倒可以分i 在1~9来一遍循环,然后10~end来一遍解决;总之只是个细节问题,应该也有其它trick用来解决~
回复