sh/bash/dash/ksh/zsh等Shell脚本
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#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

-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#3
帖子
由 eexpress » 2011-12-14 15:05
加一个循环
for n in `seq 1 10`; do
xxxxx
done
● 鸣学
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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
-
联系:
#5
帖子
由 枫叶饭团 » 2011-12-14 22:55
我也比较喜欢自增,可以无限下去。。。。。
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#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
#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
#8
帖子
由 naturalaw » 2011-12-15 22:06
mplayer不返回布尔值。
mplayer ed6.mp4|grep 'File not found'
echo $?
1
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#9
帖子
由 mimihu88 » 2011-12-15 23:23
试过了,一个15个章节的iso,15个章节顺利提取出来,但是mplayer没有报错也没有终止,而是进行第16个章节,这个章节在iso中是不存在的,体积一直在增长,已经超过单个章节可能的体积,我人工中断了程序......
顺便发一个固定章节的提取bash:

也也捣鼓了两天,还好比我原先写15行省了好多事
见楼下

上次由
mimihu88 在 2011-12-16 10:45,总共编辑 1 次。
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#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
#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
#12
帖子
由 mimihu88 » 2011-12-17 7:15
试了,不行,输出如下:
TITLES=0 CHAPTERS=
********************** SUCCESSFULLY ***********************
除了输出上面两行东西,其它完全没动静

-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#13
帖子
由 mimihu88 » 2011-12-17 7:22
另外,碰到一个问题:
文件名为:[63年地狱之赛].De.hel.van '63.iso,上面10楼的bash不能识别这个名字,我知道是因为那个
'63
造成的,改个名字就可以了,这是为什么?
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#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 ***********************"
#全自动版,按实际情况改改。
谢谢你的热心帮助,如果太麻烦就算了,我只是碰到问题想弄明白,缺乏这方面知识基础,带着问题学习事半功倍,一味看书,太枯燥,看不下去

-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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++强悍,不过可以用。