sh/bash/dash/ksh/zsh等Shell脚本
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#1
帖子
由 mimihu88 » 2011-12-25 11:27
aaa.1.vob 要改成 AAA.1.VOB
第一步
代码: 全选
#!/bin/bash
for i in *.vob
do
mv ${i} ${i/aaa/AAA}
done
这样文件名变成:AAA.1.vob
第二步
代码: 全选
#!/bin/bash
for i in *.vob
do
mv ${i} ${i/vob/VOB}
done
最终文件名:AAA.1.VOB
我的问题是,怎么改进脚本,在第一个脚本中在替换aaa成AAA的同时,把vob替换成VOB,这样一个脚本,一次就完成改名?
代码: 全选
$sudo 折腾
sudo: 折腾: command not found
-
枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
-
联系:
#2
帖子
由 枫叶饭团 » 2011-12-25 12:45
[bash]
#!/bin/bash
for i in *.vob
do
mv ${i} ${i/aaa/AAA}
mv ${i} ${i/vob/VOB}
done
[/bash]
猜的

-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#3
帖子
由 mimihu88 » 2011-12-25 13:13
枫叶饭团 写了:[bash]
#!/bin/bash
for i in *.vob
do
mv ${i} ${i/aaa/AAA}
mv ${i} ${i/vob/VOB}
done
[/bash]
猜的

绝对不行
代码: 全选
$sudo 折腾
sudo: 折腾: command not found
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#4
帖子
由 eexpress » 2011-12-25 14:12
rename带了大小写转换的。
rename 'y/A-Z/a-z/' *
● 鸣学
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#5
帖子
由 mimihu88 » 2011-12-25 16:59
eexpress 写了:rename带了大小写转换的。
rename 'y/A-Z/a-z/' *
完全不同的方法,而且rename用起来比较啰嗦
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#6
帖子
由 eexpress » 2011-12-25 17:05
不会正则,用啥lin嘛。

● 鸣学
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#7
帖子
由 josephyoung » 2011-12-25 17:16
照着你的意思,你的代码可以这样改:
代码: 全选
for i in *.vob; do
mv $i $(echo $i | sed 's/aaa\.\([^.]\)\.vob/AAA\.\1\.VOB/')
done
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#8
帖子
由 mimihu88 » 2011-12-25 18:29
eexpress 写了:不会正则,用啥lin嘛。

遇不如己者,就以讽刺羞辱之;遇强于己者,就以谩骂攻击之。
josephyoung 写了:照着你的意思,你的代码可以这样改:
代码: 全选
for i in *.vob; do
mv $i $(echo $i | sed 's/aaa\.\([^.]\)\.vob/AAA\.\1\.VOB/')
done
谢谢,受教!

代码: 全选
$sudo 折腾
sudo: 折腾: command not found
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#10
帖子
由 fnan » 2011-12-25 18:46
for i in *.vob;do
mv $i $(tr a-z A-Z <<<$i)
done
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#11
帖子
由 fnan » 2011-12-25 18:50
josephyoung 写了:照着你的意思,你的代码可以这样改:
代码: 全选
for i in *.vob; do
mv $i $(echo $i | sed 's/aaa\.\([^.]\)\.vob/AAA\.\1\.VOB/')
done
#mv $i $(echo $i | sed 's/.*/\U&/')
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#12
帖子
由 mimihu88 » 2011-12-25 19:18
谢谢fnan
怪我没说清楚
本意不是把文件名中的小写改成大写,而是替换或者改文件名不要的部分,比如:
aaa.ccc.1.fff.txt 改成 xxx.hhh.1.txt
ccc.bbb.2.sss.txt 改成 xxx.hhh.2.txt
实际情况是我解压了一个连续剧的(70集)iso,所以有70个vob要重命名,vob的名字都像这样“VTS_01_1.vob",“VTS_02_1.vob”......,这里面“VTS_"要替换成连续剧的名字,“_1”是不要的,“01”,“02”......这部分是要保留的
发这个帖子之前,我已经改完了(当然是用笨办法,运行两次脚本),比手动一个一个去改已经省事很多了

代码: 全选
$sudo 折腾
sudo: 折腾: command not found
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#13
帖子
由 josephyoung » 2011-12-25 19:25
fnan 写了:josephyoung 写了:照着你的意思,你的代码可以这样改:
代码: 全选
for i in *.vob; do
mv $i $(echo $i | sed 's/aaa\.\([^.]\)\.vob/AAA\.\1\.VOB/')
done
#mv $i $(echo $i | sed 's/.*/\U&/')
<<<$i 和 \U,学习了
To 楼主,你那样的需求用rename命令是最好了。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#14
帖子
由 fnan » 2011-12-25 20:18
kose3@kose3-desktop:~/b$ ls
VTS_01_1.vob VTS_02_1.vob VTS_03_1.vob
kose3@kose3-desktop:~/b$ rename -vn 's/.*_(.*)_.*\.(.*)/剧名$1.\U$2/' *.vob
VTS_01_1.vob renamed as 剧名01.VOB
VTS_02_1.vob renamed as 剧名02.VOB
VTS_03_1.vob renamed as 剧名03.VOB
kose3@kose3-desktop:~/b$ ls *.vob|sed -r 's/.*_(.*)_.*\.(.*)/剧名\1.\U\2/'
剧名01.VOB
剧名02.VOB
剧名03.VOB
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
mimihu88
- 帖子: 552
- 注册时间: 2006-04-03 11:26
#15
帖子
由 mimihu88 » 2011-12-25 22:57
fnan 写了:kose3@kose3-desktop:~/b$ ls
VTS_01_1.vob VTS_02_1.vob VTS_03_1.vob
kose3@kose3-desktop:~/b$ rename -vn 's/.*_(.*)_.*\.(.*)/剧名$1.\U$2/' *.vob
VTS_01_1.vob renamed as 剧名01.VOB
VTS_02_1.vob renamed as 剧名02.VOB
VTS_03_1.vob renamed as 剧名03.VOB
kose3@kose3-desktop:~/b$ ls *.vob|sed -r 's/.*_(.*)_.*\.(.*)/剧名\1.\U\2/'
剧名01.VOB
剧名02.VOB
剧名03.VOB
这一部分
代码: 全选
rename -vn 's/.*_(.*)_.*\.(.*)/剧名$1.\U$2/' *.vob
特别是perl部分明白是怎么回事了,原来只知道“.”代表任何一个英文字母,刚才突然想到如果是汉字会怎么样,特意试了一下,3个“.”代表任何一个汉字,有趣
“U$2“如果把U改成小写u,则只有第一个字母变成大写
再次谢谢fnan!