帮帮忙,一个提取DVD章节的脚本

sh/bash/dash/ksh/zsh等Shell脚本
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

帮帮忙,一个提取DVD章节的脚本

#1

帖子 mimihu88 » 2011-12-14 14:15

代码: 全选

for fl in *.iso
 do
   mplayer -chapter 1-1 -v -dumpstream -dumpfile ${fl}1.vob -dvd-device ${fl} dvd://1 
   mplayer -chapter 2-2 -v -dumpstream -dumpfile ${fl}2.vob -dvd-device ${fl} dvd://1
   ......
   mplayer -chapter n-n -v -dumpstream -dumpfile ${fl}n.vob -dvd-device ${fl} dvd://1
 done
原来的办法是有多少章节,就写多少行;
现在想智能一点,n个章节,一个命令,怎么表达这个变量n :em06
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 帮帮忙,一个提取DVD章节的脚本

#2

帖子 naturalaw » 2011-12-14 14:59

seq 30嗎?
  • The eternal law
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 帮帮忙,一个提取DVD章节的脚本

#3

帖子 eexpress » 2011-12-14 15:05

加一个循环
for n in `seq 1 10`; do
xxxxx
done
● 鸣学
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 帮帮忙,一个提取DVD章节的脚本

#4

帖子 fnan » 2011-12-14 20:06

n=0
for fl in *.iso
do
((n++))
mplayer -chapter $n-$n -v -dumpstream -dumpfile ${fl}${n}.vob -dvd-device ${fl} dvd://1
done
#用seq不如自增量
#看错了,章节是 每个iso有固定数量?那还是用seq,或者 for i in {1..n}
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 帮帮忙,一个提取DVD章节的脚本

#5

帖子 枫叶饭团 » 2011-12-14 22:55

我也比较喜欢自增,可以无限下去。。。。。
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 帮帮忙,一个提取DVD章节的脚本

#6

帖子 mimihu88 » 2011-12-15 14:16

fnan 写了:n=0
for fl in *.iso
do
((n++))
mplayer -chapter $n-$n -v -dumpstream -dumpfile ${fl}${n}.vob -dvd-device ${fl} dvd://1
done
#用seq不如自增量
#看错了,章节是 每个iso有固定数量?那还是用seq,或者 for i in {1..n}
试了一下,只能提取第一个章节,请看看什么地方要改?谢谢
P.S:章节没有固定数
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 帮帮忙,一个提取DVD章节的脚本

#7

帖子 fnan » 2011-12-15 21:42

mimihu88 写了:
fnan 写了:n=0
for fl in *.iso
do
((n++))
mplayer -chapter $n-$n -v -dumpstream -dumpfile ${fl}${n}.vob -dvd-device ${fl} dvd://1
done
#用seq不如自增量
#看错了,章节是 每个iso有固定数量?那还是用seq,或者 for i in {1..n}
试了一下,只能提取第一个章节,请看看什么地方要改?谢谢
P.S:章节没有固定数
#章节没有固定数的话,最好用自增量循环,直到检察到mplayer输出错误,进入下一个iso循环,或者能先自动检察出每个iso的章节数,再用seq。
大概是这样:
for fl in *.iso
do
n=0
while true
do
((n++))
if mplayer -chapter $n-$n -v -dumpstream -dumpfile ${fl}${n}.vob -dvd-device ${fl} dvd://1 # 如果顺利执行(我不知道mplayer是否返回布尔值,不然要另外处理):
then
continue #就继续章节自增量循环
else
break #否则下一个iso循环
fi
done
done
#测试一下,我没有iso。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 帮帮忙,一个提取DVD章节的脚本

#8

帖子 naturalaw » 2011-12-15 22:06

mplayer不返回布尔值。
mplayer ed6.mp4|grep 'File not found'
echo $?
1
  • The eternal law
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 帮帮忙,一个提取DVD章节的脚本

#9

帖子 mimihu88 » 2011-12-15 23:23

试过了,一个15个章节的iso,15个章节顺利提取出来,但是mplayer没有报错也没有终止,而是进行第16个章节,这个章节在iso中是不存在的,体积一直在增长,已经超过单个章节可能的体积,我人工中断了程序...... :em06

顺便发一个固定章节的提取bash: :em01 也也捣鼓了两天,还好比我原先写15行省了好多事 :em06

见楼下 :em09
上次由 mimihu88 在 2011-12-16 10:45,总共编辑 1 次。
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 帮帮忙,一个提取DVD章节的脚本

#10

帖子 mimihu88 » 2011-12-16 10:44

继续折腾;
手上一套30集连续剧“潜伏”的dvdiso,第一个iso是按章节分15集的,第二个iso却是按标题分的15集;
1.想办法确认iso究竟是按章节还是标题分集的,iso-info不行,提供的信息没用,lsdvd可以:
写个小脚本:
#!/bin/bash
#sudo aptitude install lsdvd libdvdread4
#sudo /usr/share/doc/libdvdread4/install-css.sh
for fl in *.iso
do
lsdvd ${fl} > ${fl}.log
done
2.如果是按章节分集:
#!/bin/bash
#isoinfo查看章节和tittle数
#如果确认是按章节分集并且已知章节数为15
for fl in *.iso
do
for chapter in {1..15}
do
mplayer -chapter ${chapter}-${chapter} -v -dumpstream -dumpfile ${fl%.iso}_${chapter}.vob -dvd-device ${fl} dvd://${tittle}
done
done
3.如果是按标题分集:
#!/bin/bash
#isoinfo查看章节和tittle数
#如果确认是按tittle分集并且tittle数为15
for fl in *.iso
do
for tittle in {1..15}
do
mplayer -chapter ${tittle}-${tittle} -v -dumpstream -dumpfile ${fl%.iso}${tittle}.vob -dvd-device ${fl} dvd://${tittle}
done
done
试过了可以用,嘿嘿!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 帮帮忙,一个提取DVD章节的脚本

#11

帖子 fnan » 2011-12-17 5:25

代码: 全选

#!/bin/bash

for fl in *.iso
do
	title=$(lsdvd 2>/dev/null|grep -c '^Title')
	chapter=$(lsdvd 2>/dev/null|sed -rn '/^Title/{s/.*Chapters: ([0-9]+).*/\1/p;q}')
	echo "TITLES=$title CHAPTERS=$chapter"
	n=0
	if [[ $title -gt $chapter ]]
	then
		while ((++n <= title))
		do
		echo "Dumpstream - $fl - TITLE $title/$n"
			mplayer -really-quiet -dumpstream -dumpfile ${fl%.iso}_${n}.vob dvd://$n # 假设标题比章节多就是按标题分集。
		done
	else
		while ((++n <= chapter))
		do
		echo "Dumpstream - $fl - CHAPTER $chapter/$n"
		mplayer -really-quiet -chapter ${n}-${n} -dumpstream -dumpfile ${fl%.iso}_${n}.vob dvd://1 # 不然就是按章节分集。
		done
	fi
done
echo " ********************** SUCCESSFULLY ***********************"
#全自动版,按实际情况改改。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 帮帮忙,一个提取DVD章节的脚本

#12

帖子 mimihu88 » 2011-12-17 7:15

试了,不行,输出如下:
TITLES=0 CHAPTERS=
********************** SUCCESSFULLY ***********************
除了输出上面两行东西,其它完全没动静 :em06
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 帮帮忙,一个提取DVD章节的脚本

#13

帖子 mimihu88 » 2011-12-17 7:22

另外,碰到一个问题:
文件名为:[63年地狱之赛].De.hel.van '63.iso,上面10楼的bash不能识别这个名字,我知道是因为那个
'63
造成的,改个名字就可以了,这是为什么?
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 帮帮忙,一个提取DVD章节的脚本

#14

帖子 mimihu88 » 2011-12-17 7:31

fnan 写了:

代码: 全选

#!/bin/bash

for fl in *.iso
do
	title=$(lsdvd 2>/dev/null|grep -c '^Title')
	chapter=$(lsdvd 2>/dev/null|sed -rn '/^Title/{s/.*Chapters: ([0-9]+).*/\1/p;q}')
	echo "TITLES=$title CHAPTERS=$chapter"
	n=0
	if [[ $title -gt $chapter ]]
	then
		while ((++n <= title))
		do
		echo "Dumpstream - $fl - TITLE $title/$n"
			mplayer -really-quiet -dumpstream -dumpfile ${fl%.iso}_${n}.vob dvd://$n # 假设标题比章节多就是按标题分集。
		done
	else
		while ((++n <= chapter))
		do
		echo "Dumpstream - $fl - CHAPTER $chapter/$n"
		mplayer -really-quiet -chapter ${n}-${n} -dumpstream -dumpfile ${fl%.iso}_${n}.vob dvd://1 # 不然就是按章节分集。
		done
	fi
done
echo " ********************** SUCCESSFULLY ***********************"
#全自动版,按实际情况改改。
谢谢你的热心帮助,如果太麻烦就算了,我只是碰到问题想弄明白,缺乏这方面知识基础,带着问题学习事半功倍,一味看书,太枯燥,看不下去 :em06
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 帮帮忙,一个提取DVD章节的脚本

#15

帖子 fnan » 2011-12-17 9:19

kose1-2@kose1-2-desktop:~$ ./1.sh
TITLES=2 CHAPTERS=12
Dumpstream - felic.iso - CHAPTER 12/1
mplayer: could not connect to socket
mplayer: No such file or directory
libdvdread: Encrypted DVD support unavailable.
************************************************
** **
** No css library available. See **
** /usr/share/doc/libdvdread4/README.Debian **
** for more information. **
** **
************************************************
Dumpstream - felic.iso - CHAPTER 12/2
mplayer: could not connect to socket
mplayer: No such file or directory
libdvdread: Encrypted DVD support unavailable.
************************************************
** **
** No css library available. See **
** /usr/share/doc/libdvdread4/README.Debian **
** for more information. **
** **
************************************************
Dumpstream - felic.iso - CHAPTER 12/3
mplayer: could not connect to socket
mplayer: No such file or directory
libdvdread: Encrypted DVD support unavailable.
************************************************
** **
** No css library available. See **
** /usr/share/doc/libdvdread4/README.Debian **
#我没有合适iso,直接用DVD光碟测试通过,你直接用iso文件要改参数。
TITLES=0 CHAPTERS=
********************** SUCCESSFULLY ***********************
#lsdvd 不工作,先单独命令行搞搞,能对iso文件有效才行。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复