当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?
帖子发表于 : 2015-12-30 14:13 
头像

注册: 2012-09-23 13:19
帖子: 164
系统: ubuntu 12.04
送出感谢: 28
接收感谢: 0 次
例如 视频名字满足 *EP xx*.mkv的通配符, 字幕满足 *EP xx*.srt, (xx是数字),但是视频和字幕的*部分是不一样的,怎么把同一集的字幕名改成跟对应视频同名啊?
我曾经在java下用listfiles 以及正则表达式 实现了这个功能,但是感觉用java代码实现这个有点麻烦,想用类shell的脚本来做,但是我不大懂shell写法,求助各位大神!


最后由 asean 编辑于 2015-12-30 16:38,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名?
帖子发表于 : 2015-12-30 14:31 
头像

注册: 2011-09-13 10:31
帖子: 157
送出感谢: 1
接收感谢: 17
可能不需要用shell脚本,用rename命令就可以,用法好像和sed差不多。可以man rename看一下。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名?
帖子发表于 : 2015-12-30 16:37 
头像

注册: 2012-09-23 13:19
帖子: 164
系统: ubuntu 12.04
送出感谢: 28
接收感谢: 0 次
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也差不多啦


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?
帖子发表于 : 2015-12-30 18:26 
头像

注册: 2010-04-10 16:14
帖子: 2903
系统: Arch Linux
送出感谢: 8
接收感谢: 69
题目没说明清楚,我就假设一种最简单的情况了。
如果 EP 后面的数字是连续不重复的(例如 1 到 12),那么应该这样就行了:
代码:
for i in {1..12}; do TARGET=(*EP${i}*.mkv) ; mv *EP${i}*.srt "${TARGET%mkv}srt" ; done


_________________
dz,U,EIS. cies.
dz-cies@github
小香猪杀手@cc98.org



_________________
评价: 3.7% asean
 
页首
 用户资料  
 
5 楼 
 文章标题 : Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?
帖子发表于 : 2015-12-30 18:54 
头像

注册: 2012-09-23 13:19
帖子: 164
系统: ubuntu 12.04
送出感谢: 28
接收感谢: 0 次
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) ;这一步死都过不去, 然后才发现 原来 '=' 跟 '('之间是不能有空格的!!我真是日了狗了


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?
帖子发表于 : 2015-12-30 19:57 
头像

注册: 2010-04-10 16:14
帖子: 2903
系统: Arch Linux
送出感谢: 8
接收感谢: 69
回头来看貌似有点问题…
如果真的是 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' 之类的就匹配不到了,
把这种情况也覆盖进来也是可以的,但是这样出来的语句就太罗嗦了懒得写了…


_________________
dz,U,EIS. cies.
dz-cies@github
小香猪杀手@cc98.org


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 怎么用命令行或者shell脚本批量把字幕名匹配为视频名(名字均不大规则)?
帖子发表于 : 2015-12-30 20:02 
头像

注册: 2012-09-23 13:19
帖子: 164
系统: ubuntu 12.04
送出感谢: 28
接收感谢: 0 次
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用来解决~


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译