生成目录结构算法的bash, perl和python实现

本文介绍了用bash、perl和python三种语言实现的目录结构打印脚本。这些脚本能够递归地展示目录及其子目录的结构,便于快速了解文件系统的布局。

这是分别用bash, perl和python实现同一个算法来结构化打印出指定目录的实现。输出结果类似如下:

_result_

BASH CODE:

#! /bin/bash

print_dir(){
        n_tab=$2
        until [ "$n_tab" = "0" ]
        do
                printf "\t"
                n_tab=$(($n_tab - 1))
        done
        echo ${1##*/}
}
list_dir(){
        print_dir $@
        if [ -d $1 ]
        then
                for sub_dir in $(ls $1); do
                        list_dir $1/$sub_dir $(($2+1))
                done
        fi
}
list_directory(){
        list_dir $1 0
}

if [ "$#" != "1" ];then
        echo "Usage: ./make_dir_tree.sh dir"
        exit 1
fi
#ls $1 >/dev/null 2>&1
if [ ! ls $1 >/dev/null 2>&1 ]
then
        echo "This is not a valid directory or file!"
        exit 1
fi
list_directory $1

结论: bash的语法非常琐碎,进行算数运算不方便 ,没有自增,自减运算,如$a=$a+1的运算在bash中表达式为a=$(($a+1))。 布尔运算主要借助test或[ ]表达式,也可用命令行的返回值,command成功执行返回真。 使用[ ]时要注意空格 : (while)if空格[空格-d空格directory空格]。最后发现了${}操作符很好用,主要拿来在字符串中插入扩展的变量用。$1是从命令行传给脚本的第一个参数,$0是脚本名字,$#是除脚本名外的参数个数。


PERL CODE:

#! /usr/bin/perl

use strict;
use 5.010;

sub list_dir {
        my ($dir, $depth) = @_;
        printf "%s%s\n", "\t"x$depth, $dir;
        if( -d $dir ){
                my @list = <$dir/*>;
                foreach (@list){
                        list_dir($_, $depth+1)
                }
        }

}

sub list_directory {
        list_dir($ARGV[0], 0)
}

die "Usage: ./make_dir_tree.pl dir\n" if @ARGV != 1;
die "This is not a valid directory or file!\n" unless -d $ARGV[0] or -f _;

list_directory; 

结论:perl的文件测试操作很好用,用法和shell相似,但更简洁。perl的表达能力感觉比较强,代码可以写到很短。$ARGV[0]是命令行传入的第一个参数。perl下面可用"字符串"x表达式  这种方式来重复字符串。              

PYTHON CODE:

#! /usr/bin/python

import sys, os, glob

def list_dir(dir, depth):
        print("%s%s"% ("\t"*depth, dir))
        if(os.path.isdir(dir)):
                for sub_dir in glob.glob(dir+'/*'):
                        list_dir(sub_dir, depth+1)

def list_directory():
        list_dir(root, 0)

if(len(sys.argv) != 2):
        print "Usage: ./make_dir_tree.py dir"
        exit(1)
root = sys.argv[1]
if(not os.path.exists(root)):
        print "This is not a valid directory or file!\n"
        exit(1)
list_directory()
结论:python也有很强表达力,代码很干净。sys.argv[0]是脚本名,sys.argv[1]是第一个参数。和perl相比,python在文件和路径测试上要显示调用os.path模块下面的api,也不能说不方便,主要是很容易忘记需要的api在哪个模块下。python下可用"字符串"*表达式 来重复字符串。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值