在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

快一起试试吧~

相关推荐
张小姐的猫4 分钟前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
YuanDaima204835 分钟前
Linux 进阶运维与 AI 环境实战:进程管理、网络排错与 GPU 监控
linux·运维·服务器·网络·人工智能
lolo大魔王2 小时前
Linux 数据文件处理实战:排序、搜索、压缩、归档一站式详解
linux·运维·服务器
starvapour2 小时前
Ubuntu切换到Fcitx5中文输入法
linux·运维·ubuntu
lolo大魔王3 小时前
Linux的监测程序
linux·运维·github
.YYY3 小时前
RHCE--Linux循环执行的例行性任务:crontab从入门到精通
linux·运维·服务器
木欣欣粉皮3 小时前
解决Ubuntu 26.04的挂起状态唤醒问题
linux·运维·ubuntu
ambition202423 小时前
UNIX消息队列:从理论模型到工程实现的演进
linux·服务器·unix
阿正的梦工坊3 小时前
【Typescript】08-keyof-typeof-索引访问类型
linux·ubuntu·typescript
轩Scott4 小时前
Ubuntu开机卡Logo?NVIDIA驱动修复全攻略
linux·ubuntu