文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>用Perl实现linux命令tree的简化风格

用Perl实现linux命令tree的简化风格

时间:2010-08-03  来源:zhuyubei

今天被要求写文档,需要写出指定目录下的目录结构。开始想到用tree命令。但是由于要求不要显示名称满足指定格式的文件夹及其子文件夹,而我查了下tree的man,似乎发现只能过滤文件,不能过滤文件夹的。虽然我们可以通过grep来过滤掉那些满足模式的文件夹,但是其子文件夹不会被过滤掉。本来想直接修改tree的源码,但是想想c语言的文本处理复杂性,只好选择perl做个简单的tree.该程序只显示文件夹,对于满足一定正则表达式的文件夹,不显示该文件夹,及其下所有内容。

代码如下

#!/usr/bin/perl
=pod
用来显示指定目录的子目录,不显示目录格式诸如
2010.08.03.22.00.00之类的时间戳记目录及其子目录

使用格式为tree.pl dir
=cut

use Cwd;
use strict;

my $filter = "^\\d{4}(\\.\\d\\d){5}\$";#过滤
my $count = 0; #目录计数

&tree(0,$ARGV[0]);
print "Directory Number:\t$count\n";

sub tree
{
    my ($sep,$toScan) = @_;
    my $currdir = cwd;
    

    #按照上下级文件夹格式,缩进显示文件
    print "| " x $sep,"$sep--",$toScan,"\n";

    #打开目录,读取目录下的内容
    opendir my $dir,$toScan or die "unable to open dir!\n";
    my @names = readdir $dir;
    ++$count;
    closedir $dir;#注意关闭文件
    
    #进入该目录,以相对路径形式读取,其下目录
    chdir $toScan;

    foreach my $name (sort @names){
        #忽略这2个文件
        next if ($name eq '.');
        next if ($name eq '..');
        if ( -d $name ){#判断是否是目录

        #过滤指定目录
        next if( $name =~ /$filter/);
        

        #递归读取该目录下的内容,子文件夹缩进显示增加
        &tree($sep+1,$name);
        }
    }
    #回到原始目录,否则递归就失败了
    chdir $currdir;
}

0--/home/zhu/Documents/
| 1--C
| | 2--tree-1.5.3
| | | 3--man
| 1--My Music
| 1--My Pictures
| 1--My Video
| 1--Mysql
| | 2--mysql_scripts
...(省略)

| | | | 4--driver
| | | | 4--error
| | | | 4--util
| | | 3--ch05
| | | | 4--fetchall_arrayref
| | | | 4--html
| | | | 4--prepare
| | | 3--ch06
| | | 3--ch08
| | 2--PerlExp
| | | 3--Getopt
| | | 3--IO

...

| | | | 4--man
| 1--shell
| | 2--csh
Directory Number: 126

不过我的perl代码和linux的tree相比,实在是差得远了,有时间要好好看下tree的实现,顺便在这里分析下.

相关阅读 更多 +
排行榜 更多 +
我要当超人

我要当超人

休闲益智 下载
幸存者的命运

幸存者的命运

飞行射击 下载
精英战区3d

精英战区3d

飞行射击 下载