新手求助。如何批量修改文件名字?

新手求助。如何批量修改文件名字?

目录中的文件有多种扩展名字,只想把里面 所有 txt 的文件修改成 扩展名字是 lst 的。

在网络上找到了一个 添加目录名字到文件名字前面的脚本,但是不知道如何修改成我想要的,
这个脚本已经在本地运行过了,可以使用,请各位帮忙看看如何修改。,多谢。

#!/usr/bin/perl
####################################################
#### sleetdrop@gmail.com
#### change the files name from it's original
#### name to pathname plus it's original name.
#### put this script in the beginning dir and run
####################################################
@paths=();
sub chmovname{
       for $file (glob "*"){
               if(-d $file){
                       push @paths, $file;
                       chdir $file;
                       &chmovname;
                }
               if(-f $file){
                       $newfile=join "_", @paths;
                       $newfile.=$file;
                       rename $file, $newfile;
                }
        }
       chdir "../";
       pop @paths;
}
&chmovname;
试试这样可以不,请把文件放在需要文件的目录里。

#!/usr/bin/perl
use strict;
use warnings;

my @list=glob('./*.txt');
foreach my $li (@list)
{
        my $newname=$li;
        $newname=~s/txt$/lst/g;
        rename $li, $newname;
}
print "done\n";

试试先,多谢 yhy 侠客~~;)

不过目录比较多。。。最好能遍历所有目录,还有目录中的目录。。

。。。。怎么办呢?



QUOTE:
原帖由 abc123122 于 2008-1-14 21:00 发表
目录中的文件有多种扩展名字,只想把里面 所有 txt 的文件修改成 扩展名字是 lst 的。

在网络上找到了一个 添加目录名字到文件名字前面的脚本,但是不知道如何修改成我想要的,
这个脚本已经在本地运行过了 ...
#!/usr/bin/perl
####################################################
#### sleetdrop@gmail.com
#### change the files name from it's original
#### name to pathname plus it's original name.
#### put this script in the beginning dir and run
####################################################
@paths=();
sub chmovname{
       for $file (glob "*"){
               if(-d $file){
                       push @paths, $file;
                       chdir $file;
                       &chmovname;
                }
               if(-f $file && $file =~ /(.*)(\.txt)$/){
                       $newfile=join "_", @paths;
                       $newfile.=$file;
                       rename $file, "$1.lst";
                }
        }
       chdir "../";
       pop @paths;
}
&chmovname;

如色
多谢 Lonki    , 运行成功了。 :)

还有个问题,如何才能 忽略 txt 的大小写呢?
有的扩展名字是 txt ,有的是 TXT 有的是Txt ,这样就有几个问题无法转换了。。

暂时找到了一个比较笨的办法。。

sub chmovname{
       for $file (glob "*"){
               if(-d $file){
                       push @paths, $file;
                       chdir $file;
                       &chmovname;
                }
               if(-f $file && $file =~ /(.*)(\.txt)$/){
                       $newfile=join "_", @paths;
                       $newfile.=$file;
                       rename $file, "$1.lst";
                }
               if(-f $file && $file =~ /(.*)(\.TXT)$/){
                       $newfile=join "_", @paths;
                       $newfile.=$file;
                       rename $file, "$1.lst";
                }
                #如果还有在加。。。。。
        }
       chdir "../";
       pop @paths;
}
&chmovname;



perl的确是个简单、功能强大的东东。。

/i  忽略字母的大小写(大小写无关)  
/s  令 . 匹配换行符并且忽略不建议使用的 $* 变量  
/m  令 ^ 和 $ 匹配下一个嵌入的 \n。  
/x  忽略(大多数)空白并且允许模式中的注释  
/o  只编译模式一次  



if(-f $file && $file =~ /(.*)(\.txt)$/i){       <--看这一行
                       $newfile=join "_", @paths;
                       $newfile.=$file;
                       rename $file, "$1.lst";
                }

也如色
use File::Find;
用这个,这个会遍历目录下所有文件.
试验成功,多谢zhangkeyijian了

/i  忽略字母的大小写(大小写无关)  

这个说明是在什么地方找到的?
我把上面的程序改写了一下,去掉一些没用的代码.

#!/usr/bin/perl

sub chmovname{
       for $file (glob "*"){
               if(-d $file){
                       chdir $file;
                       &chmovname;
                        chdir ".." ;
                }
               if(-f $file && $file =~ /(.*)(\.txt)$/i){
                       rename $file, "$1.lst";
                }
        }
}

&chmovname;