乌拉利用python实现tree命令
Posted ___Leo___
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命令的主要内容,如果未能解决你的问题,请参考以下文章