在mac环境下使用shell脚本实现tree命令

文章目录

使用ls实现tree

实现思路

  1. 使用ls -F 打印文件类型,如果是目录后面跟/,如果是可执行文件后面跟*;

  2. 使用grep -v /$ 筛选文件排除目录,-v为反向筛选;

  3. 使用grep /$ 仅筛选目录;

  4. ${files[@]} 是获取数组的全部元素;

  5. 获取文件直接打印,获取目录后,打印目录,拼接父目录给当前目录(因为shell执行总是在当前目录,如果只传目录,会报错找不到目录),然后递归打印。
    代码如下:

    #!/bin/bash

    将shell默认的三种分隔符中的空格分隔符剔除,解决文件名有空格情况下的问题

    IFS=$'\t\n'

    函数:递归地打印目录内容

    print_tree() {
    local indent=1 local dir=2
    local files=((ls -F dir | grep -v /)) local dirs=((ls -F dir | grep /))
    # 打印当前目录的文件
    for file in "{files[@]}"; do echo "{indent}{file}" done # 递归打印目录 for subdir in "{dirs[@]}"; do
    echo "{indent}{subdir}"
    subdir="{dir}/{subdir}"
    print_tree "|......{indent}" {subdir}
    done
    }

    从当前目录开始打印树状图

    print_tree "" "."

测试一下,输出如下:

复制代码
a/
|......b/
|......|......c/
|......|......d/
|......|......f/
|......c/
|......|......f/
|......|......|......test*
|......|......|......tt.txt

当然这种方法虽然简单,但是文件是可执行文件,那么在文件名后会跟一个*,风格不统一,下面再介绍一种打印方式。

使用find实现tree

实现思路:
find 命令加参数-type f 可以仅查找文件排除掉目录,但是查出来的文件带父目录,maxdepth可以指定查找深度,1表示只在本层目录中查找;
basename 命令可以删除指定结尾的后缀,也能打印除了/的最后一部分字符。比如basename /usr/local/Centos输出结果为Centos,但是如果目录名有空格就不会得到预期的效果;
tr 命令可以替换字符,比如可以将目录名中的空格替换为/,使得basename可以得到预期效果;

代码如下:

复制代码
#!/bin/bash
IFS=$'\t\n'
# 函数:递归地打印目录内容
print_tree() {
    local indent=$1
    local dir=$2
    local files=($(find $dir -maxdepth 1 -type f ))
    local dirs=($(find $dir -maxdepth 1 -type d))
    if [ "${#dirs[@]}" -gt "0" ];then
	unset dirs[0]
    fi
    # 打印当前目录的文件
    for file in "${files[@]}"; do
        echo "${indent}$(basename $(echo $file | tr ' ' '\'))"
    done

    # 递归打印目录
    for subdir in "${dirs[@]}"; do
	echo "${indent}$(basename $(echo $subdir | tr ' ' '\ '))"
	print_tree "|......${indent}" ${subdir}
    done
}

# 从当前目录开始打印树状图
print_tree "" "."

测试一下,输出如下:

复制代码
a
|......c
|......|......f
|......|......|......test
|......|......|......tt.txt
|......b
|......|......f
|......|......c
|......|......d

快一起试试吧~

相关推荐
Kusunoki_D14 分钟前
速查 Linux 常用指令 II
linux·运维·服务器
xmweisi0235 分钟前
Ansible内置模块之 group
linux·运维·ansible·rhce·rhca·红帽认证
小猪写代码42 分钟前
Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可
linux·python·ubuntu
孤寂大仙v1 小时前
【Linux笔记】——Linux线程理解与分页存储的奥秘
linux·运维·笔记
有谁看见我的剑了?2 小时前
ubuntu 22.04 wifi网卡配置地址上网
linux·运维·ubuntu
码农新猿类2 小时前
Ubuntu摄像头打开失败
linux·运维·ubuntu
PWRJOY3 小时前
Ubuntu磁盘空间分析:du命令及常用组合
linux·运维·ubuntu
ASDyushui3 小时前
Shell 编程之正则表达式与文本处理器
linux·正则表达式
zuozewei3 小时前
安全扫描之 Linux 杀毒软件 Clamav 安装
linux·运维·安全
wangchen_03 小时前
linux-信号保存和处理
linux·运维·服务器