分页: 1 / 1

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

发表于 : 2015-12-30 14:13
asean
例如 视频名字满足 *EP xx*.mkv的通配符, 字幕满足 *EP xx*.srt, (xx是数字),但是视频和字幕的*部分是不一样的,怎么把同一集的字幕名改成跟对应视频同名啊?
我曾经在java下用listfiles 以及正则表达式 实现了这个功能,但是感觉用java代码实现这个有点麻烦,想用类shell的脚本来做,但是我不大懂shell写法,求助各位大神!

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

发表于 : 2015-12-30 14:31
duguyipiao
可能不需要用shell脚本,用rename命令就可以,用法好像和sed差不多。可以man rename看一下。

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

发表于 : 2015-12-30 16:37
asean
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也差不多啦

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

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

代码: 全选

for i in {1..12}; do TARGET=(*EP${i}*.mkv) ; mv *EP${i}*.srt "${TARGET%mkv}srt" ; done

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

发表于 : 2015-12-30 18:54
asean
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) ;这一步死都过不去, 然后才发现 原来 '=' 跟 '('之间是不能有空格的!!我真是日了狗了

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

发表于 : 2015-12-30 19:57
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' 之类的就匹配不到了,
把这种情况也覆盖进来也是可以的,但是这样出来的语句就太罗嗦了懒得写了…

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

发表于 : 2015-12-30 20:02
asean
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用来解决~