乌拉利用python实现tree命令

Posted 罪途

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乌拉利用python实现tree命令相关的知识,希望对你有一定的参考价值。

由于服务器中没有tree命令,且自己没有权限install新命令,只能自个用python实现该命令,费劲

具体实现方法如下

以下操作基于Linux,python2

1. 首先就是随便选个位置,然后新建个py文件(这里选在了"~/.basic_scipt",命名为"tree.py",可参考)。py文件内容如下:

#!/usr/bin/python2
# coding:utf-8
import os
import sys

# -d 只显示目录
# -a 显示所有目录
# -L num 显示几层,不显示隐藏文件

def print_color(color,argv):
    if   color == "green":
        print("\\033[32m"+argv+"\\033[0m")
    elif color == "read":
        print("\\033[31m"+argv+"\\033[0m")
    elif color == "yellow":
        print("\\033[33m"+argv+"\\033[0m")
    else :
        print(argv)

def is_hidden(file):
    file_name = os.path.basename(file)
    if file_name[0] == '.':
        return True
    else:
        return False

def get_len_of_listdir(lst,show_hidden=True):
    len_of_listdir = 0
    for file in lst:
        if show_hidden == True:
            len_of_listdir += 1
        elif is_hidden(file) is not True:
            len_of_listdir += 1
    return len_of_listdir

def tree_dir(dir, show_hidden_file, direct_only, layer_limit, layer_max,layer=0):
    layer_max = int(layer_max)
    files = os.listdir(dir)
    files.sort()
    file_lst=[]
    dir_lst=[]
    for file in files:
        file_path = os.path.join(dir, file)
        if os.path.isdir(file_path):
            dir_lst.append(file)
        else:
            file_lst.append(file)
    if show_hidden_file == False:
        len_of_listdir = get_len_of_listdir(dir_lst)
        len_of_listfile = get_len_of_listdir(file_lst)
    else:
        len_of_listdir = get_len_of_listdir(dir_lst,show_hidden=False)
        len_of_listfile = get_len_of_listdir(file_lst,show_hidden=False)

    if direct_only is not True:
        index = 0
        for file in file_lst:
            file_path = os.path.join(dir, file)        
            if layer_limit == True and layer >= layer_max:
                continue
            if show_hidden_file == False and is_hidden(file) is True:
                continue 
            index += 1
            print(" |   " * (layer)),
            if (layer >= 0):
                if index == len_of_listfile and len_of_listdir == 0:
                    print("|__ "),
                else:
                    print("|__ "),
            print(file)

    index = 0
    for file in dir_lst:
        file_path = os.path.join(dir, file)        
        if layer_limit == True and layer >= layer_max:
            continue
        if show_hidden_file == False and is_hidden(file) is True:
            continue   
        index += 1
        print(" |   " * (layer)),
        if (layer >= 0):
            if index == len_of_listdir:
                print("|__ "),
            else:
                print("|__ "),

        print_color("green", file)
        tree_dir(file_path, show_hidden_file, direct_only, layer_limit, layer_max,layer + 1)

def parse_option(op_str):
    print("option:" + op_str)
    import re
    layer_limit = False
    layer_max = 0
    direct_only = False
    show_hidden_file = False
    match_str = format("-L[\\s]+\\d")
    search_ret = re.search(match_str, op_str)
    if search_ret is not None:
        layer_limit = True
        match_str = format("\\d")
        search_ret = re.search(match_str, search_ret.group(0))
        if search_ret is not None:
            layer_max = search_ret.group(0)
    match_str = format("-a")
    search_ret = re.search(match_str, op_str)
    if search_ret is not None:
        show_hidden_file = True
    match_str = format("-d")
    search_ret = re.search(match_str, op_str)
    if search_ret is not None:
        direct_only = True
    return show_hidden_file, direct_only, layer_limit, layer_max

if __name__ == '__main__':
    file_name = sys.argv[0]
    if len(sys.argv) < 2:
        print_color("red", "args invalid\\n")
        sys.exit(1)
    path_dir = sys.argv[1]
    op = ""
    for idx in range(len(sys.argv)):
        if idx >= 2:
            op += " " + sys.argv[idx]
    show_hidden_file, direct_only, layer_limit, layer_max = parse_option(op)

    tree_dir(path_dir,show_hidden_file, direct_only, layer_limit, layer_max)
    sys.exit(0)

2. 功能选项如下所示,详见第五条内容中的代码部分

# -d 只显示目录
# -a 显示所有目录
# -L num 显示几层,不显示隐藏文件

3. 找到home目录下的".bashrc"文件(或".cshrc"文件,均为隐藏文件。这里用的是bashrc文件)。进入文件后编辑,随意找个位置添加一行alias指令,内容如下:

alias tree='python ~/.basic_scipt/tree.py ./'

如果没有找到".bashrc"文件,修改".cshrc"文件亦可,命令如下(bashrc和cshrc修改一个即可):

alias tree 'python ~/.basic_scipt/tree.py ./' #注意没有等号=

4.完成以上操作之后,记得保存并退出。然后在命令终端执行如下指令(source),以使bashrc文件(或cshrc文件)的更改生效:

$ source ~/.bashrc
# 或
$ source ~/.cshrc

5. 在source命令执行完之后,就已经大功告成了,赶紧找个目录tree一下试试吧。如果报错的话,就看看python代码部分有没有错误吧。

$ tree       #没错就这么简单,但还可以加一些参数,如下
$ tree -L 2  #显示两层文件,避免眼花缭乱
$ tree -d    #只显示目录

6. 需要注意的是,该代码是使用的python2平台,如是python3平台的话,估计 肯定会出现不兼容,然后报错。

7. 需要注意的第二点,由于对该命令作了些简化,所以只能实现对当前所在路径的tree,即加一些路径当作参数是不可以的。例:

$ tree ../  #这是错误的用法

python代码参考了其他人的博客,略微做了些修改,忘记出处了,见谅

如果您在实际使用中出现问题或者有更好的解决办法,欢迎留言。

以上是关于乌拉利用python实现tree命令的主要内容,如果未能解决你的问题,请参考以下文章

乌拉利用python实现tree命令

呜啦啦乌拉利用python实现回收站

呜啦啦乌拉利用python实现回收站

呜啦啦乌拉利用python实现回收站

利用Map,完成下面的功能:

吾生也有涯,吾知也无涯_乌拉(11)