精华内容
下载资源
问答
  • Linux tree命令 简单实现

    千次阅读 2018-03-05 18:32:10
    模拟实现tree命令: #include<stdio.h> #include<stdlib.h> #include<dirent.h> #include<sys/stat.h> #include<unistd.h> void print_...

    tree命令,将目录文件以树的形式呈现

    系统的tree命令效果:
    这里写图片描述

    模拟实现tree命令:

    #include<stdio.h>
    #include<stdlib.h>
    #include<dirent.h>
    #include<sys/stat.h>
    #include<unistd.h>
    
    void print_tree(const char* dirname, int indent)
    {
        DIR *pdir = opendir(dirname);
        struct dirent *pd;
        struct stat sbuf;
        chdir(dirname);
    
        while((pd = readdir(pdir)) != NULL)
        {
            lstat(pd->d_name, &sbuf);
    
            if(strcmp(pd->d_name, ".") == 0 || 
                    strcmp(pd->d_name, "..") == 0)
            {
                continue;
            }
            int depth = indent;
            while(depth--)
                printf("| _");
            printf("%s\n", pd->d_name);   
            depth = indent;
            if(S_ISDIR(sbuf.st_mode))
            {
                print_tree(pd->d_name, depth+2);
                printf("|\n");
            }
    
        }
        chdir("..");
        closedir(pdir);
    }
    
    int main(int argc, char* argv[])
    {
        if(argc != 2)
        {
            printf("usage: ./tree dir\n");
            exit(1);
        }
        printf("%s\n", argv[1]);
        printf("|\n");
        print_tree(argv[1], 1);
        printf("\n");
        return 0;
    }
    

    效果:
    这里写图片描述

    用到的知识:

    DIR结构体

    struct __dirstream
    {
        void *__fd; /* `struct hurd_fd' pointer for descriptor.   */
        char *__data; /* Directory block.   */
        int __entry_data; /* Entry number `__data' corresponds to.   */
        char *__ptr; /* Current pointer into the block.   */
        int __entry_ptr; /* Entry number `__ptr' corresponds to.   */
        size_t __allocation; /* Space allocated for the block.   */
        size_t __size; /* Total valid data in the block.   */
        __libc_lock_define (, __lock) /* Mutex lock for this structure.   */
    };
        typedef struct __dirstream DIR;
    opendir函数 DIR *opendir(const char *name);//打开文件目录   
    readdir函数 struct dirent *readdir(DIR *dirp);//读取文件目录    
    closedir函数 int closedir(DIR *dirp);//关闭文件目录
    stat结构体
    struct stat {
                   dev_t     st_dev;     /* ID of device containing file */
                   ino_t     st_ino;     /* inode number */
                   mode_t    st_mode;    /* protection */
                   nlink_t   st_nlink;   /* number of hard links */
                   uid_t     st_uid;     /* user ID of owner */
                   gid_t     st_gid;     /* group ID of owner */
                   dev_t     st_rdev;    /* device ID (if special file) */
                   off_t     st_size;    /* total size, in bytes */
                   blksize_t st_blksize; /* blocksize for file system I/O */
                   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
                   time_t    st_atime;   /* time of last access */
                   time_t    st_mtime;   /* time of last modification */
                   time_t    st_ctime;   /* time of last status change */
               };
    dirent结构体
    struct dirent 
    {
           ino_t          d_ino;       /* inode number */
           off_t          d_off;       /* offset to the next dirent */
           unsigned short d_reclen;    /* length of this record */
           unsigned char  d_type;      /* type of file; not supported
                                          by all file system types */
           char           d_name[256]; /* filename */
    };
    展开全文
  • 内网不能下载linux tree工具包,动手写之。 先上一个能实现最基础功能的乞丐版片段。 # coding=utf-8 # Author : BaoJunxian # Date : 2018/11/27 import os, sys PREFIX = ['└─ ', '├─ '] INDENTION = ['│ ...

    内网不能下载linux tree工具包,动手写之。
    先上一个能实现最基础功能的乞丐版片段。

    # coding=utf-8
    # Author : BaoJunxian
    # Date : 2018/11/27
    
    import os, sys
    
    PREFIX = ['└─ ', '├─ ']
    INDENTION = ['│  ', ' '*4]
    
    def tree(path , depth=1, flag=True, relation=[]):
        files = os.listdir(path)
        yield ''.join([PREFIX[not flag],os.path.basename(path),'\n'])
    
        depth += 1
        relation.append(flag)
    
        for i in files:
            for j in relation:
                yield INDENTION[j]
            tempPath = os.path.join(path,i)
            if not os.path.isdir(tempPath):
                yield ''.join([PREFIX[i!=files[-1]], i, '\n'])
            else:
                for i in tree(tempPath,depth,i==files[-1],relation[:]):
                    print(i,end='')
    
    if __name__ == '__main__':
        for i in tree(sys.argv[1]):
            print(i,end='')
    

    基础功能完成。

    E:\code\python>python tree.py ./module
    └─ module
        ├─ .vscode
        │  ├─ launch.json
        │  ├─ sdf
        │  │  ├─ aaadfadfdfw
        │  │  │  └─ gfdgfgfg
        │  │  └─ asdf.py
        │  └─ settings.json
        ├─ test.py
        └─ test.sh
    
    

    基础功能完好。
    再装个Linux Tree,简单对比下性能好赖。
    编辑如下脚本:

    [task1.py]
    import subprocess,time
    def run():
        begin = time.time()
        p = subprocess.Popen('python tree.py /home',shell=True)
        p.communicate()
        end = time.time()
        return (end-begin)
    
    sum = 0
    for i in range(20):
        sum += run()
    
    print(sum/20)
    
    [task2.py]
    import subprocess,time
    def run():
        begin = time.time()
        p = subprocess.Popen('tree /home',shell=True)
        p.communicate()
        end = time.time()
        return (end-begin)
    
    sum = 0 
    for i in range(20):
        sum += run()
    
    print(sum/20)
    
    [root@kilo-k5-controller baojx]# python task1.py
    ...
    8.05839397907
    [root@kilo-k5-controller baojx]# python task2.py
    ...
    6241 directories, 39772 files
    8.46183406115
    

    粗略看来,性能还是可以的。
    问题:
    有个现象比较奇怪,自己写的工具对整个根目录进行遍历绘制的时候,占用内存相当多(这个是可以理解的,毕竟整个文件系统相当庞大,会同时切片多个列表记录绘制过程中的缩进、绘制符号等)、时间较长(毕竟文件多),but,手动将进程关掉之后,虚拟终端还是在不停的往外print,这些内容实在什么地方缓存了、导致程序终止了还在传???真是不可思议。暂时没想到为什么,日后再说吧。

    计划将其完善成一个更为好用的工具,日后再传。

    展开全文
  • 用Python实现Linux tree命令

    千次阅读 2015-06-11 16:38:28
    早就耳闻python 功能强大,互联网领域运用广泛,Scrapy爬虫框架、OpenStack云...先参考网上的demo写一个小例子,实现linux tree命令。 #!/usr/bin/python import os, sys, stringclass XXXTree: def __init__(self):

    早就耳闻python 功能强大,互联网领域运用广泛,Scrapy爬虫框架、OpenStack云存储架构都是用Python实现的。最近下定决心,开始学习Python。先参考网上的demo写一个小例子,实现linux tree命令。

    #!/usr/bin/python
    import os, sys, string
    
    class XXXTree:
        def __init__(self):
            pass
    
        def printHelp(self, cmd):
            print "Please use the follow cmd"
            print "     " + cmd + 'dir'
            print "e.g"
            print "     " + cmd + "/root/Kedacom_src"
    
        def getTree(self, dir, op):
            list = self.getList(dir, 0, op)
            treeList = []
            #遍历文件列表,进行格式化输出处理,将处理后的元素添加到treeList中
            for i in range(1, len(list)):
                fullpath = list[i]
                filename = os.path.basename(fullpath)
    
                if(fullpath == dir):
                    treeList.append(fullpath)
                    continue
    
                path = fullpath.replace(dir, "")
                names = path.split('/')
                name = "|-- " + names[len(names)-1]
                for tmp in range(1, len(names)-1):
                    name = "    " + name 
    
                treeList.append(name)
    
                pos = name.find('&')
                if (pos >= 0):
                    j = i-1
                    if j >= 0:
                        name = treeList[j]
                        if (name[pos] == '&'):
                            tmp = name.index('|')
                            name = name[0:tmp] + "`" + name[tmp+1:pos]
                            treeList[j] = name
    
            for i in range(0, len(treeList)):
                print treeList[i]
    
        #递归获取目录下所有的文件,除去隐形文件
        def getList(self, dir, layer, op):
            list = [ ]
            if (layer == 0):list.append(dir)
            #对目录下的文件列表进行排序
            files = sorted(os.listdir(dir))
            for file in files:
                if (file[0] == '.'):
                    continue
                file = os.path.join(dir, file)
                if os.path.isdir(file):
                    list.append(file)
                    list += self.getList(file, layer+1, op)
                elif (op == '-d'):
                    pass
                else:
                    list.append(file)
            newfile = file + '&'
            pos = list.index(file)
            list[pos] = newfile
            return list
    
    if (len(sys.argv) < 2):
        t = XXXTree()
        t.printHelp(sys.argv[0])
    
    else:
        t = XXXTree()
    
        dir = None
        if (len(sys.argv) == 2):dir = sys.argv[1]
    
        op = None
        if (len(sys.argv) == 3):
            op = sys.argv[1]
            dir = sys.argv[2]
    
        t.getTree(dir, op)
    

    运行结果

    脚本运行结果

    系统命令tree运行结果

    展开全文
  • 直接上代码 #include #include #include #include #include #include ...char list[100] = {0};...struct dirent *getdir(DIR *pDIR) ...前面窗口是由自己函数实现,后面窗口函数是由系统tree指令实现

    直接上代码

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <stdio.h>
    #include <string.h>
    
    char list[100] = {0};
    struct dirent *getdir(DIR *pDIR)
    {
    	struct dirent *pdirent = NULL;
    	while(pdirent = readdir(pDIR))
    	{	
    		/* 
    		* 这里会有"."和".."目录,要显示隐藏文件,一定要排除这两个目录
    		*/
    		if('.' != *(pdirent->d_name))
    			break;
    	}
    	return pdirent;
    }
    
    int tree_list(char *pdir,int depth)
    {
    	struct stat sb;
    	DIR *pDIR = NULL;
    	struct dirent *pdirent = NULL,*pdirent_prev = NULL;
    	char path[100] = {0};
    	int i;
    	if (stat(pdir, &sb) == -1) 
    	{
            perror("dir not exist!\n");
            return -1;
        }
    	if (!S_ISDIR(sb.st_mode))
    	{
    		perror("it is not a dir!\n");
    		return -1;
    	}
    	pDIR = opendir(pdir);
    	if (NULL == pDIR)
    	{
    		printf("Open Direct Fail\n");
    		return -1;
    	}
    
    	pdirent_prev = getdir(pDIR);
    	if(NULL == pdirent_prev)
    		return 0;
    	pdirent = getdir(pDIR);
    	list[depth] = 1;
    	do
    	{	
    		for (i = 0; i < depth; i ++)
    		{
    			if(list[i])
    				printf("│ ");
    			else
    				printf("  ");
    		}
    		if(pdirent)
    		{
    			printf("├─");
    		}
    		else
    		{
    			printf("└─");
    			list[depth] = 0;
    		}
    		printf("%s\n",pdirent_prev->d_name);
            if (DT_DIR == pdirent_prev->d_type)
    		{
    			memset(path, 0, 100);
    			strcpy(path, pdir);
    			strcat(path, "/");
    			strcat(path, pdirent_prev->d_name);
    			tree_list(path, depth + 1);
    		}
    		pdirent_prev = pdirent;
    		if(pdirent)
    		{	
    			pdirent = getdir(pDIR);
    		}
    	}while(pdirent_prev != NULL);
    	
    	closedir(pDIR);
    	return 0;
    }
    
    void tree(char *path)
    {
    	if (NULL == path)
    	{
    		printf("Path Not NULL\n");
    		return ;
    	}
    	
    	tree_list(path,1);
    }
    
    int delete_all(char *path)
    {
    	return 0;
    }
    
    
    int main()
    {
    	tree("/home");
    }



    前面窗口是由自己函数实现,后面窗口函数是由系统tree指令实现

    展开全文
  • 在网上看了一篇 Linux tree命令的Python实现,刚好也这个需求,遂下来自己改了一改,满足自己的需求,先把源码分享给大家: #!/usr/bin/python import os, sys, string class XXTree: def __init__(self): ...
  • python3 实现 linux 命令 tree

    千次阅读 2016-12-18 15:15:20
    system:centos6.7 python -V:3.5.2 用递归的方法遍历文件和文件夹,并统计他们的个数 后带的参数看查看子文件夹或绝对路径的树形结构图,省略后带参数则查看当前文件夹 #!/usr/bin/env python3 ...def tree(d,le
  • 实现linuxtree命令

    2018-07-13 20:21:38
  • Linux--tree命令实现

    千次阅读 2016-12-30 20:37:32
    一个简单的实现。 参考#include #include #include #include #include #include <stdlib.h>void printdir(const char* dir, int depth){ DIR *dp; struct di
  • 用惯了Linux上的tree命令来展示目录结构,今天远程Win10上,需要通过目标结构写一些脚本,查看了下Powershell是默认有个tree命令的,但是不支持指定深度 所以,这篇文章主要是实现tree命令展示指定深度的目录结构...
  • Linuxtree命令的C语言实现

    千次阅读 2017-12-10 11:52:00
    一、tree命令是干什么的?  我们经常用tree命令来查看指定目录下的目录文件结构,并以树状结构显示。 二、明确需求:  1、显示目录下的所有文件  2、遇到目录则要进入目录,并显示该目录下的所有文件 ...
  • 有一个无法忽视的事实,基础研发的突破,让这一切成为可能 , ...Device Tree 的目标 好,看启动的时候 Linux是如何知道系统的内存大小 /* 该函数做了一下事情 1 : 获取内存 base 和 size...
  • 详细描述了linux内核中是如何实现Multi-Order Radix Tree的,分析了几个具体的api。
  • ``` struct list_head*plist list_for_each(l,&(root_dentry->d_subdirs)) { struct dentry* temp=list_entry(plist,struct dentry,d_child); if(temp) ...怎么使用dentry结构实现tree命令呢?
  • linuxtree、命令的用法及实现代码

    千次阅读 2011-12-16 08:05:16
    Linux下有这样一个命令,可以把当前目录下的所有文件和子文件以tree的方式显示出来,看下效果 [www.linuxidc.com@localhost test]$ tree . |-- A |-- B |-- C `-- test2 |-- D |-- E `-- F 3 ...
  • ubuntu下用sheel脚本完整实现tree功能,1.1 该部分实现树形结构这里写代码片 !/bin/bash branch_vline="│ " #Branch vertical line branch_null=" " #null separation branch middle_branch_end="├── " #...
  • linux device tree

    千次阅读 2014-02-13 17:58:10
    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重
  • 今天小编来给分享Linux 系统下一个非常有用的命令的使用:tree命令可以以树形结构显示文件目录结构,它非常适合于我们给别人介绍我们的文件目录的组成框架,同时该命令使用适当的参数也可以将命令结果输出到文本文件...
  • linuxtree命令等代

    2018-06-05 15:16:57
    Linux tree命令用于以树状图列出目录的内容。执行tree指令,它会列出指定目录下的所有文件...于是,通过linux命令组合,依然能够实现tree命令的效果。如下:find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'...
  • 在ubuntu系统中默认是没有tree这个命令的,需要安装,用下面的命令就可以安装tree这个命令工具sudo apt-get install tree 2  首先小编来说说怎么样使用tree这个命令,其实有个非常简单的办法,...
  • ARM Linux 3.x的设备树(Device Tree

    万次阅读 多人点赞 2013-01-01 17:32:36
    本文部分案例和文字英文...更多精华文章请扫描下方二维码关注Linux阅码场 1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the a...
  • package javaiotest; import java.io.*; import java.util.Scanner; public class FileExplore { private File file = null;... public int fileNum = 0;... System.out.println("请输入要遍历的目录:");...
  • linux中的优先搜索树的实现--prio_tree

    千次阅读 2010-06-28 21:45:00
    prio_treelinux内核中被应用于反向内存映射,prio-tree是一棵查找树,它查找的是一个区间,为何将之组织成tree是一个数学问题,简单理解就是根节点包含了所有的区间,父节点代表的区间包含了子节点代表的...
  • 用Python实现Linux下的tree命令的基本功能,没有实现各种参数。写得不好,欢迎拍砖。 觉得原来的没有Python的风格,换了一个写法,感觉格式不好看。。。 新的: import os def tree(path): def tree_iter...
  • Linux内核Radix Tree

    2016-03-24 11:44:09
    转自:http://www.linuxidc.com/Linux/2014-09/107015.htm 一、概述 Linux radix树最广泛的用途是用于内存管理,结构address_space通过radix树跟踪绑定到地址映射上的核心页...Linux radix树的API函数在lib/radix-tree

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,119
精华内容 25,247
关键字:

linuxtree实现

linux 订阅