当前位置: 首页 > news >正文

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

文章目录

  • 使用ls实现tree
  • 使用find实现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=$1local dir=$2local files=($(ls -F $dir | grep -v /$))local dirs=($(ls -F $dir | grep  /$))# 打印当前目录的文件for file in "${files[@]}"; doecho "${indent}${file}"done# 递归打印目录for subdir in "${dirs[@]}"; doecho "${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=$1local dir=$2local files=($(find $dir -maxdepth 1 -type f ))local dirs=($(find $dir -maxdepth 1 -type d))if [ "${#dirs[@]}" -gt "0" ];thenunset dirs[0]fi# 打印当前目录的文件for file in "${files[@]}"; doecho "${indent}$(basename $(echo $file | tr ' ' '\'))"done# 递归打印目录for subdir in "${dirs[@]}"; doecho "${indent}$(basename $(echo $subdir | tr ' ' '\ '))"print_tree "|……${indent}" ${subdir}done
}# 从当前目录开始打印树状图
print_tree "" "."

测试一下,输出如下:

a
|……c
|……|……f
|……|……|……test
|……|……|……tt.txt
|……b
|……|……f
|……|……c
|……|……d

快一起试试吧~

http://www.lryc.cn/news/339211.html

相关文章:

  • 递归时间复杂度分析方法:Master 定理
  • 实例名不规范导致mds创建失败
  • OpenGL中的纹理过滤GL_NEAREST和GL_LINEAR
  • vue 性能优化
  • 互联网大厂ssp面经(操作系统:part1)
  • Android Activity 启动涉及几个进程
  • 说说你对链表的理解?常见的操作有哪些?
  • 每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?
  • llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署
  • C语言游戏实战(11):贪吃蛇大作战(多人对战)
  • 腾讯测试岗位的面试经历与经验分享【一面、二面与三面】
  • 手机移动端网卡信息获取原理分析
  • 无人新零售引领的创新浪潮
  • SD-WAN提升企业网络体验
  • Docker搭建Let‘s Encrypt
  • 单链表讲解
  • DFS算法系列 回溯
  • Linux C应用编程:MQTT物联网
  • 企业常用Linux文件命令相关知识+小案例
  • Istio介绍
  • 代码随想录算法训练营第四十七天|leetcode115、392题
  • 将Ubuntu18.04默认的python3.6升级到python3.8
  • Python和Java哪个更适合后端开发?
  • Python+pytest接口自动化之cookie绕过登录(保持登录状态)
  • 什么数据集成(Data Integration):如何将业务数据集成到云平台?
  • 国外EDM邮件群发多少钱?哪个软件好?
  • C语言入门算法——回文数
  • OceanBase—操作实践
  • 智慧用电安全管理系统
  • Rust语言入门第二篇-Cargo教程