天天看点

来看一道Perl面试题

据说这道题是QQ的,看下怎么解答为好

题目:

把当前目录下(包含子目录)下所有后缀为.sh的文件后缀变更为.shell(用PERL完成)

一、先人为的制造一些.sh文件

这个用shell吧,方便

for i in `seq 100`;do touch $i.sh;done 

for i in testa testb testc testd teste testf testg;do touch /home/test/$i.sh;done 

好,生成文件,OK,部分图

[root@test ~]# ll /home/ 

total 404 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 100.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 10.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 11.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 12.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 13.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 14.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 15.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 16.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 17.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 18.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 19.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 1.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 20.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 21.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 22.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 23.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 24.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 25.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 26.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 27.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 28.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 29.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 2.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 30.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 31.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 32.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 33.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 34.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 35.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 36.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 37.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 38.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 39.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 3.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 40.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 41.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 42.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 43.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 44.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 45.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 46.sh 

/home/test下

[root@test ~]# ll /home/test/ 

total 0 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testa.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testb.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testc.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testd.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 teste.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testf.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testg.sh

写perl 脚本,记得perl有一个模块叫File::Find,可以完成这个效果,试下

code:

#!/usr/bin/perl -w 

use strict; 

use File::Find; 

sub wanted { 

    if (-f $File::Find::name) { 

        if ($File::Find::name =~ m/\.sh$/) { 

            #print $File::Find::name,"\n"; 

            #print $_,"\n"; 

            #print $File::Find::dir,"\n"; 

            $File::Find::name =~ s/\.sh$/\.shell/g; 

            rename $_,$File::Find::name; 

        } 

    } 

find(\&wanted,'/home'); 

运行一下,测试,大喜,完成,部分图

[root@WEB-01 ~]# ll /home/ 

total 4 

-rw-r--r-- 1 root root    0 Mar  2 09:47 100.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 10.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 11.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 12.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 13.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 14.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 15.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 16.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 17.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 18.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 19.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 1.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 20.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 21.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 22.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 23.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 24.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 25.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 26.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 27.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 28.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 29.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 2.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 30.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 31.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 32.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 33.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 34.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 35.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 36.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 37.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 38.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 39.shell 

[root@WEB-01 ~]# ll /home/test/ 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testa.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testb.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testc.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testd.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 teste.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testf.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testg.shell 

呵,perl 的File::Find模块有三个特殊的变量

$_                 包含目录中的当前文件名 

$File::Find::dir   包含当前目录名 

$File::Find::name  包含$File::Find::dir/$_ 

其他的功能尚待研究ing.谢谢大家。

本文转自dongfang_09859 51CTO博客,原文链接:http://blog.51cto.com/hellosa/504161,如需转载请自行联系原作者