您的位置:首页 > 运维架构 > Shell

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

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




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下可用"字符串"*表达式 来重复字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐