在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.mzph.cn/news/801481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

-bash: cd: /etc/hadoop: 没有那个文件或目录

解决办法:source /etc/profile 运行 source /etc/profile 命令会重新加载 /etc/profile 文件中的配置,这样做的目的是使任何更改立即生效,而不需要注销并重新登录用户。通常,/etc/profile 文件包含系统范围的全局 Shell 配置&…

密文模糊检索

对密文数据进行分词组合,将分词组合的结果集分别进行加密,查询时通过key like %partial%。 先对字符进行固定长度的分组,将一个字段拆分为多个,比如说根据4位英文字符(半角),2个中文字符&#…

设计流程与内容:SQL注入、跨站脚本攻击(XSS)及未授权访问漏洞防护

设计流程与内容:SQL注入、跨站脚本攻击(XSS)及未授权访问漏洞防护 一、引言 随着信息技术的飞速发展,Web应用程序已成为人们日常生活和工作中不可或缺的一部分。然而,这些应用程序的安全性却时常受到各种威胁&#x…

asp.net网上水果销售平台 水果购物商城系统+sqlserver

网上水果销售平台 说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库 功能模块: asp.net网上水果销售平台 水果购物商城系统 用户功能有 网站首页 全部水果 我的订单 购物车用户…

安全运营中心(SOC)的核心功能

安全运营中心(SOC)的核心功能主要体现在以下几个方面: 安全事件监测与响应:SOC通过部署在安全基础设施上的传感器、日志收集器和安全设备,实时收集和分析网络流量、系统日志、用户行为等数据,以便及时发现并…

如何将CSDN的文章以PDF文件形式保存到本地

1.F12 打开开发者工具窗口 2.console下输入命令 (function(){$("#side").remove();$("#comment_title, #comment_list, #comment_bar, #comment_form, .announce, #ad_cen, #ad_bot").remove();$(".nav_top_2011, #header, #navigator").remove…

flutter组件_AbsorbPointer

官方说明:A widget that absorbs pointers during hit testing. 翻译:一个在命中测试期间吸收指针的Widget。 作者释义:阻止子元素的点击事件 。 AbsorbPointer的定义 const AbsorbPointer({super.key,this.absorbing true,this.ignoringSe…

Rust 标准库 API 文件和文件夹操作 File,读取/创建/修改/追加/删除/重命名文件等

File::create 使用File的关联函数&#xff08;类似Java中的静态方法&#xff09;create&#xff0c;创建文件&#xff0c;如果存在&#xff0c;则覆盖。 use std::fs::{File, Metadata};fn main() -> std::io::Result<()> {let file: File File::create("foo.…

【氮化镓】三星200mm 硅基高阈值电压p-GaN器件

【High threshold voltage p-GaN gate power devices on 200 mm Si】——IPSD2013 摘要&#xff1a; 三星公司的研究人员介绍了一种高阈值电压、低导通电阻和高速的GaN-HEMT功率器件&#xff0c;该器件在栅极堆叠中使用了p-GaN层。文章提出了三个创新点&#xff1a;首先&#…

SSL、TLS和HTTPS:网络安全的重要基石

随着互联网的快速发展&#xff0c;网络安全问题日益凸显。为了保护数据在传输过程中的安全&#xff0c;各种加密协议和技术应运而生。SSL&#xff08;安全套接层&#xff09;、TLS&#xff08;传输层安全&#xff09;和HTTPS&#xff08;超文本传输安全协议&#xff09;是三个最…

AWS 给IAM用户分配——允许使用 MFA,自行管理自己的密码、访问密钥和 SSH 公有密钥的权限

问题 需要给开发组的IAM用户分配&#xff0c;如下权限&#xff1a; 允许使用 MFA自行管理自己的密码访问密钥SSH 公有密钥的权限 权限json {"Version": "2012-10-17","Statement": [{"Sid": "AllowViewAccountInfo",&qu…

K8S Deployment HA

文章目录 K8S Deployment HA1.机器规划2.前期准备2.1 安装ansible2.2 修改 hostname2.3 配置免密2.4 时间同步2.5 系统参数调整2.6 安装 Docker2.7 部署 HaproxyKeepalived 3. 部署 K8S3.1 安装 k8s命令3.2 k8s初始化3.3 添加其他master节点3.4 添加 Node节点3.5 安装 CNI3.6 查…

SpringBoot:基于使用application.yml文件配置多环境方式的作用

阅读 点击此处可跳转&#xff1a;application.yml文件配置多环境方式(dev、test、prod)

AI日报:北大Open Sora视频生成更强了;文心一言可以定制你自己的声音;天工 SkyMusic即将免费开放;

&#x1f916;&#x1f4f1;&#x1f4bc;AI应用 北大Open Sora视频生成更强了!时长可达10秒&#xff0c;分辨率更高 【AiBase提要:】 ⭐️ Open-Sora-Plan v1.0.0模型发布 显著提升视频生成质量和文本控制能力 ⭐️ 支持华为昇腾910b芯片&#xff0c;提升运行效率和质量。 ⭐…

Github 2024-04-08 开源项目周报Top15

根据Github Trendings的统计,本周(2024-04-08统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7Jupyter Notebook项目2TypeScript项目2C项目1Shell项目1C++项目1JavaScript项目1Mojo项目1Rust项目1非开发语言项目1编程面试大学:…

国内镜像源拉取Ubuntu,并实现网络配置

一、配置docker镜像 1. 将docker镜像更换成国内的源 编辑/etc/docker/daemon.json vim /etc/docker/daemon.json{"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com"] }如果没有该文件&#xff0c;则新建文…

pytorch演示pipeline并行

pytorch演示pipeline并行 1.单卡内存不够时,可以将网络切分成几段(stage),每个GPU负责一个stage。比如GPU0计算完之后将数据发送给GPU1算后续的stage 2.以上的方式,会导致GPU的利用率不高,可以将输入的batch切分成多份更小的batch,陆续送给GPU0,这样GPU0处理完micro batch0之后…

第四百四十八回

文章目录 1. 知识回顾2. 使用方法3. 代码与功能3.1 示例代码3.2 功能说明 4. 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将介绍OverlayTooltip用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上…

MP4视频如何转OGV视频格式?视频格式转换的方法

一&#xff0c;什么是OGV视频格式 OGV是一个使用OGG开源格式的容器。 OGG不受软件专利的限制&#xff0c;这是其创建的主要目标之一。 OGV格式用于存储带或不带音频的视频流&#xff0c;而视频流又可以用Opus&#xff0c;Vorbis&#xff0c;Theora或Speex算法压缩。该格式用于…

以XX公司为例的Acrel1000DP分布式光伏监控系统在5.98MW分布式光伏10KV并网系统的应用

分布式光伏监控系统 目前&#xff0c;光伏电站中装设的电力二次系统主要有光伏后台监控系统、计量系统、远动通讯屏、调度数据网屏、防孤岛保护装置、电能质量在线监测装置、频率电压紧急控制装置等&#xff0c;部分光伏电站还建设有向发电集团传输数据的系统。 分布式光伏监…