分页: 1 / 2
批量重命名,怎么改进
发表于 : 2011-12-25 11:27
由 mimihu88
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,这样一个脚本,一次就完成改名?
Re: 批量重命名,怎么改进
发表于 : 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]
猜的

Re: 批量重命名,怎么改进
发表于 : 2011-12-25 13:13
由 mimihu88
枫叶饭团 写了:[bash]
#!/bin/bash
for i in *.vob
do
mv ${i} ${i/aaa/AAA}
mv ${i} ${i/vob/VOB}
done
[/bash]
猜的

绝对不行
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 14:12
由 eexpress
rename带了大小写转换的。
rename 'y/A-Z/a-z/' *
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 16:59
由 mimihu88
eexpress 写了:rename带了大小写转换的。
rename 'y/A-Z/a-z/' *
完全不同的方法,而且rename用起来比较啰嗦
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 17:05
由 eexpress
不会正则,用啥lin嘛。

Re: 批量重命名,怎么改进
发表于 : 2011-12-25 17:16
由 josephyoung
照着你的意思,你的代码可以这样改:
代码: 全选
for i in *.vob; do
mv $i $(echo $i | sed 's/aaa\.\([^.]\)\.vob/AAA\.\1\.VOB/')
done
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 18:29
由 mimihu88
eexpress 写了:不会正则,用啥lin嘛。

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

Re: 批量重命名,怎么改进
发表于 : 2011-12-25 18:38
由 josephyoung

神被误解了
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 18:46
由 fnan
for i in *.vob;do
mv $i $(tr a-z A-Z <<<$i)
done
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 18:50
由 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&/')
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 19:18
由 mimihu88
谢谢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”......这部分是要保留的
发这个帖子之前,我已经改完了(当然是用笨办法,运行两次脚本),比手动一个一个去改已经省事很多了

Re: 批量重命名,怎么改进
发表于 : 2011-12-25 19:25
由 josephyoung
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命令是最好了。
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 20:18
由 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
Re: 批量重命名,怎么改进
发表于 : 2011-12-25 22:57
由 mimihu88
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!