一个批量改名脚本的问题!

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
uusky
帖子: 159
注册时间: 2006-09-02 10:02

一个批量改名脚本的问题!

#1

帖子 uusky » 2007-08-16 10:24

我的一个朋友,他是在sun服务器工作的。不过显然是初学者!问我(另一个超级大菜鸟)怎么写一个重命名的脚本文件。
当前 改后
g101 g201
g102 g202
g103 g203
…… ……
g198 g298
g199 g299
就是把第二个字符改成2。
我尝试了几下,搞不定!特长请教高手!对了,他的系统似乎只有mv。所以……请高手指点!
上次由 uusky 在 2007-08-16 11:30,总共编辑 1 次。
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15

#2

帖子 iblicf » 2007-08-16 11:25

不知道solaris 有没有 rename :
rename 's/^g1/g2/' *
头像
uusky
帖子: 159
注册时间: 2006-09-02 10:02

#3

帖子 uusky » 2007-08-16 11:29

没有啊!兄弟!我让他看了。应该没有的。
他说他直接敲入rename说没有找到该条命令。我估计八成就没有。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#4

帖子 eexpress » 2007-08-16 11:31

编译安装吧。perl的。
for i in *
do
j=`echo $i|sed /^g1/^g2/`
mv $i $j
done

乱写的。自己测试。
● 鸣学
头像
uusky
帖子: 159
注册时间: 2006-09-02 10:02

#5

帖子 uusky » 2007-08-16 12:28

我晕!把老子逼急了!

来一招狠的!不知道能不能行!

代码: 全选

#include <stdio.h>

int main(int argc,char **argv)
{
    char src_name[10]  = "g100";
    char dest_name[10] = "g200";
    int  i;

    for (i=0; i<99; i++)
    {
        src_name[2] = i/10+'0';
        dest_name[2] = i/10+'0';

        src_name[3] = i%10+'0';
        dest_name[3] = i%10+'0';

        if (rename(src_name,dest_name) <0)
        {
            printf("%s not find!\n",src_name);
        }
    }

    return 0;
}
头像
uusky
帖子: 159
注册时间: 2006-09-02 10:02

#6

帖子 uusky » 2007-08-16 12:41

这样对于我来说还算比较好理解一些!虽然有些“暴力”!哈哈……

在我的电脑上是OK的!不知道在sun的solaris上能不能顺利编译。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#7

帖子 bones7456 » 2007-08-16 12:50

那还得有编译环境才行哦~
关注我的blog: ε==3
头像
iblicf
帖子: 3766
注册时间: 2007-01-15 17:15

#8

帖子 iblicf » 2007-08-16 12:51

for i in g*
do
j=${i//g1/g2}
#echo $j
mv $i $j
done
头像
uusky
帖子: 159
注册时间: 2006-09-02 10:02

#9

帖子 uusky » 2007-08-16 13:31

TO iblicf:
先生果真神人也!(三国演义看多了!呵呵!)
谢谢各位了!

j=${i//g1/g2}

这句有点不明白?不知先生是否有空解答小生的困惑啊?
leeyee
帖子: 723
注册时间: 2006-04-11 9:01

#10

帖子 leeyee » 2007-08-16 13:44

代码: 全选

${variable//pattern/string}
意思就是将variable中匹配模式pattern的最长部分替换成string。具体到你的例子里就是将当前目录下所有g*开头的文件中匹配g1的部分替换成g2。

另外还有一种表示是

代码: 全选

${variable/pattern/string}
这个就只替换第一个匹配g1的内容。

假设文件名为g1233g1abc,那么第一种模式匹配后新的文件名就变成g2233g2abc,而第二种模式匹配后则是g2233g1abc。
I would love to change the world, but they won't give me the source code.
http://hi.baidu.com/wienerlee
头像
uusky
帖子: 159
注册时间: 2006-09-02 10:02

#11

帖子 uusky » 2007-08-16 16:06

TO leeyee:

你太强了!佩服啊!
leeyee
帖子: 723
注册时间: 2006-04-11 9:01

#12

帖子 leeyee » 2007-08-16 19:14

uusky 写了:TO leeyee:

你太强了!佩服啊!
这也是书本上的,比你早看到罢啦!
I would love to change the world, but they won't give me the source code.
http://hi.baidu.com/wienerlee
回复