批量重命名,怎么改进

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
联系:

Re: 批量重命名,怎么改进

#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]
猜的 :em06
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 批量重命名,怎么改进

#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]
猜的 :em06
绝对不行

代码: 全选

$sudo 折腾
sudo: 折腾: command not found
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 批量重命名,怎么改进

#4

帖子 eexpress » 2011-12-25 14:12

rename带了大小写转换的。

rename 'y/A-Z/a-z/' *
● 鸣学
mimihu88
帖子: 552
注册时间: 2006-04-03 11:26

Re: 批量重命名,怎么改进

#5

帖子 mimihu88 » 2011-12-25 16:59

eexpress 写了:rename带了大小写转换的。

rename 'y/A-Z/a-z/' *
完全不同的方法,而且rename用起来比较啰嗦
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 批量重命名,怎么改进

#6

帖子 eexpress » 2011-12-25 17:05

不会正则,用啥lin嘛。

:em04
● 鸣学
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 批量重命名,怎么改进

#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

Re: 批量重命名,怎么改进

#8

帖子 mimihu88 » 2011-12-25 18:29

eexpress 写了:不会正则,用啥lin嘛。

:em04
遇不如己者,就以讽刺羞辱之;遇强于己者,就以谩骂攻击之。 :em04 :em04 :em04
josephyoung 写了:照着你的意思,你的代码可以这样改:

代码: 全选

for i in *.vob; do
    mv $i $(echo $i | sed 's/aaa\.\([^.]\)\.vob/AAA\.\1\.VOB/')
done
谢谢,受教! :em11 :em11 :em11

代码: 全选

$sudo 折腾
sudo: 折腾: command not found
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 批量重命名,怎么改进

#9

帖子 josephyoung » 2011-12-25 18:38

:em70 神被误解了
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 批量重命名,怎么改进

#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

Re: 批量重命名,怎么改进

#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

Re: 批量重命名,怎么改进

#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”......这部分是要保留的
:em06 :em06 :em06

发这个帖子之前,我已经改完了(当然是用笨办法,运行两次脚本),比手动一个一个去改已经省事很多了 :em09 :em09 :em09

代码: 全选

$sudo 折腾
sudo: 折腾: command not found
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 批量重命名,怎么改进

#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,学习了 :em01

To 楼主,你那样的需求用rename命令是最好了。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 批量重命名,怎么改进

#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

Re: 批量重命名,怎么改进

#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个“.”代表任何一个汉字,有趣 :em11 :em11 :em11
“U$2“如果把U改成小写u,则只有第一个字母变成大写 :em06

再次谢谢fnan!
回复