寻求用shell编程修改大批文件后缀的途径

寻求用shell编程修改大批文件后缀的途径

具体情况是这样的,我某次从网上下载了约40M的MYSQL说明书,准备看看,结果用蚂蚁下载发现文件后缀完全不对,用浏览器打不开,除非一个个用打开方式。我想到用批处理方式解决,正好目前在学linux,想用shell编程实现的方法。我需要指出的是由于这些文件名为manual_Adding_functions.html#Adding_functions 这样的类似格式,可能存在前部分文件名完全一样(及.html前名字一样)的情况,而这批文件个数在400左右,在高级开发工具里面当然有find(next)这类函数,当时我的确不清楚怎么样用shell实现,今天查了半天书,头绪没理清楚。      
改为:
manual_Adding_functions_1.html
manual_Adding_functions_2.html
manual_Adding_functions_3.html
……
不就行了?      
我也知道可以改名字来实现呀,可是拜托,你看看这么多的文件,430个之多,非要手动改吗?我的意思是能不能用编程直接实现哦~      
我不太明白你的问题。是否说现有一大堆文件其名字有如下格式
manual_Adding_functions.html#Adding_functions
你想用shell将#号及以后的内容去掉然后为.html前的文件名加上顺序号?      
文件是否都在同一个目录下?      
痛苦就在于此,所有的430个文件都在一个目录下,当然用windows的打开方式可以一个个解决,可是实在头疼。我希望的shell编程要求不高,只要把这430个文件改成可正常读的就好。至于采取数字顺序,这个是个人编程解决方式之一,估计也是比较好解决的方案了!
所以,请列位把自己的编程思路赐教一下 :confused:      
我提出一个方案,用shell的字符串处理功能

i=1
for filename in *html*
do
  fn=${filename/%${filename##*html}/}
  echo "${fn/%html/}$i.html"
  let "i+=1"  
done

上述方案显示了接数值递增的新文件名。你看看是否合你要求。我觉得用字符串取代效率不太好,有谁能提出一个更好的方案吗?      
复制内容到剪贴板
代码:
#!/usr/bin/perl -w

$ADDSTR=1;

if(!defined $ARGV[0])
{
        print "A dir arg is needed!\n";
        exit(1);
} #必需代一个目录名作为参数

$DIRNAME=$ARGV[0];

#读出目录中的文件
if(!opendir(DIR,$DIRNAME))
{
        print "No such dir \n";
        exit(2);
}
@FILES=readdir(DIR);
closedir(DIR);

foreach $FILE (@FILES)
{
        $FILENAME="$DIRNAME/$FILE";
        if($FILE ne "." && $FILE ne "..")        #去掉 . 和 .. 两个系统目录
        {
                print "check $FILENAME ...\n";
                if(-d $FILENAME)  #如果该文件是目录,循环调用此程序
                {
                        system("./dname $FILENAME/");
                }
                elsif(($pos=index($FILE,".html#"))!=-1)
                {
                        $NEWNAME="$DIRNAME".substr($FILE,0,$pos)."_$ADDSTR".".html";  #构造新名字
                        system("mv $FILENAME $NEWNAME"); #改名
                        $ADDSTR=$ADDSTR+1;
                }
        }
}
既然在同一个目录下可以去掉
                if(-d $FILENAME)  #如果该文件是目录,循环调用此程序
                {
                        system("./dname $FILENAME/");
                }