分页: 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]
猜的 :em06

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

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嘛。

:em04

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嘛。

: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

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

发表于 : 2011-12-25 18:38
josephyoung
:em70 神被误解了

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

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

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

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

再次谢谢fnan!