我的编程空间,编程开发者的网络收藏夹
学习永远不晚

通过Golang实现linux命令ls命令(命令行工具构建)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

通过Golang实现linux命令ls命令(命令行工具构建)

ls 命令

要实现ls,首先先我们复习一下ls命令。

  • ls不加任何参数,表示查询当前目录下的文件/文件夹
  • ls后面加上路径,列出所有,不包含隐藏文件/文件夹
  • ls -a列出所有,包括以.开头的隐藏文件

此命令还有很多功能,这一节的重点是命令行程度的编写,就实现上面四个。

os.Args 读取参数

定义如下,一个数组。该数组长度由参数个数决定,第一个参数为程序本身,后面为参数列表。

var Args []string

比如ls -lArgs=["ls","-l"],我们现在实现ls+目录,或者缺省目录时默认当前目录代码如下。

func main() {
	targetDirPath := "./"
	if len(os.Args) > 1 {
		targetDirPath = os.Args[1]
	}

	if dirList, err := ioutil.ReadDir(targetDirPath); err == nil {
		for _, dirInfo := range dirList {
			fmt.Print(dirInfo.Name() + " ")
		}
	} else {
		fmt.Println(err.Error())
	}
}
  • 使用 os.Agrs 来获取传入程序的参数
  • 使用 ioutil.ReadDir 读取目录,将返回值[] FileInfo遍历,输出目录/文件信息
  • 将遇到的error输出到 终端

输出

$ go build -o ls main.go
$ ./ls 
main.go folder ls
$ ./ls folder
file1 file2

看,我们已经简单的实现了。但我们会发现,要使用-开头的参数时,用os.Args这个还需要手写更多复杂逻辑去判断输入的到底是路径,还是其他参数,于是下一个包登场了。

pflag

昨天的每日一Go已经讲了flag包,pflag 包与 flag 包的工作原理甚至是代码实现都是类似的,下面是 pflag 相对 flag 的一些优势:

  • 支持更加精细的参数类型:例如,flag 只支持 uintuint64,而 pflag 额外支持 uint8uint16int32 等类型。
  • 支持更多参数类型:ipip maskip netcount、以及所有类型的 slice 类型。
  • 兼容标准 flag 库的 FlagFlagSetpflag 更像是对 flag 的扩展。
  • 原生支持更丰富的功能:支持 shorthanddeprecatedhidden 等高级功能。
var a = pflag.BoolP("all", "a", false, "Include directory entries whose names begin with a dot (.).")
	var help = pflag.BoolP("help", "h", false, "Show this help message.")
	pflag.Parse()
	if *help {
		pflag.Usage()
		return
	}
	args := pflag.Args()
	if len(args) == 0 {
		args = append(args, "./")
	}
	if len(args) == 1 {
		ShowPath(args[0], *a)
	} else {
		for _, v := range args {
			fmt.Println(v + ":")
			ShowPath(v, *a)
		}
	}
  • 列出文件夹的方式写到了ShowPath函数里,第二参数是一个bool判断是否列出全部文件(包括隐藏文件)感兴趣去看我源代码,这里不是重点。
  • pflag.BoolP 定义一个bool类型的参数,支持长短参数形式--all,-a,返回值是指针。
  • pflag.Parse() 调用这个函数,把参数值设置到相应指针的指向里。
  • pflag.Usage() 用法打印。

这样我们就实现了ls的基本功能。测试一下。

$ go build -o ls main.go
$ ./ls
folder go.mod go.sum main.go 
$ ./ls -a
. .. .git folder go.mod go.sum main.go 
$ ./ls ./ folder 
./:
folder go.mod go.sum main.go 
folder:
file1 file2
$ ./ls -h
Usage of ./ls:
  -a, --all    Include directory entries whose names begin with a dot (.).
  -h, --help   Show this help message.

是不是相当给力啦!

小结

命令行读取一共有五个常用的包

  • os.Args 系统包提供的参数解析。
  • flag:简单参数解析,昨天的每日一Go分享过。
  • pflag:命令行参数解析。
  • cobra:应用命令行框架,改天再分享。
  • viper:配置文件、环境变量、命令行、缓冲区。今天群里的每日一Go已经分享了,就不多说了。

命令行工具,你只要赋予可执行权限,再放到bin里面,他就会成为一个系统命令,方便你做更多的事情,比如备份数据库之类的动作,提高你的运维效率。 哦对了源码在这:https://github.com/golang-minibear2333/cmd_utils

以上就是通过Golang实现linux命令ls命令(命令行工具构建)的详细内容,更多关于Golang命令行工具的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

通过Golang实现linux命令ls命令(命令行工具构建)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

通过Golang实现linux命令ls命令(命令行工具构建)

这篇文章主要为大家详细介绍了如何通过Golang实现一个linux命令ls命令(命令行工具构建),文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
2023-01-13

Node.js怎么实现命令行工具

这篇“Node.js怎么实现命令行工具”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js怎么实现命令行工具”文章吧
2023-07-04

node通过npm写一个cli命令行工具

前言 如果你想写一个npm插件,如果你想通过命令行来简化自己的操作,如果你也是个懒惰的人,那么这篇文章值得一看。 po主的上一篇文章介绍了定制自己的模版,但这样po主还是不满足啊,项目中我们频繁的需要新建一些页面,逻辑样式等文件,每次都手动
2022-06-04

Linux命令行工具exa怎么用

小编给大家分享一下Linux命令行工具exa怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!exa 命令简介exa 是一个命令行工具,可以列出指定路径(如未指
2023-06-27

Linux 通过 autojump 命令减少 cd 命令的使用的实现方法

Linux - 通过 autojump 命令减少 cd 命令的使用 1、安装 autojumpgit clone git://github.com/joelthelion/autojump.git安装cd autojump ./instal
2022-06-03

实用的Linux命令行工具有哪些

这篇文章主要介绍实用的Linux命令行工具有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Linux下的三个命令行工具,分别是管理网络的nmcli,管理软件包的pkcon,管理系统进程的systemctl。Ne
2023-06-16

Linux如何通过命令行建立dmg文件

这篇文章主要介绍“Linux如何通过命令行建立dmg文件”,在日常操作中,相信很多人在Linux如何通过命令行建立dmg文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux如何通过命令行建立dmg文件
2023-06-12

如何通过命令行工具保护你的Linux服务器

要通过命令行工具保护Linux服务器,可以采取以下措施:1. 更新和维护系统:定期更新操作系统和软件包,以修复已知漏洞,并确保服务器的安全性。2. 使用防火墙:设置防火墙规则以限制对服务器的访问。可以使用防火墙工具如iptables或fir
2023-10-18

怎么通过Linux命令行连接WiFi

小编给大家分享一下怎么通过Linux命令行连接WiFi,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!目标:仅使用命令行工具来配置 WiFi发行版:适用主流的那些发
2023-06-16

Golang函数如何用于命令行工具?

go 函数可将命令行工具的复杂功能分解为可管理的模块,从而提高代码的可维护性和可读性。以下步骤说明了 go 函数在命令行工具中的作用:定义函数来执行特定任务。在主函数中调用函数,传入适当的参数。函数执行任务并返回结果。主函数处理结果并执行后
Golang函数如何用于命令行工具?
2024-04-12

Windows实现通过cmd命令行启动mysql

目录一、我原来的启动方式二、First Try三、Second Try四、Third Try五、登录并查询数据总结一、我原来的启动方式某天打开电脑启动mysql的时候,Ctrl Shift + Esc当打开以后呢,我陷入了短暂的思考中,作
Windows实现通过cmd命令行启动mysql
2024-10-17

SCA命令行工具怎样快速构建FaaS服务

这期内容当中小编将会给大家带来有关SCA命令行工具怎样快速构建FaaS服务,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Serverless 架构(无服务器架构),是云计算时代一种全新的、革命性的架构模式
2023-06-05

通过命令行工具提高你的Linux服务器安全性

有几种方法可以通过命令行工具提高Linux服务器的安全性:1. 使用防火墙:使用iptables或ufw等工具配置防火墙规则,限制对服务器的访问。可以禁止不必要的端口和服务,并只允许来自特定IP地址或IP范围的访问。2. 更新和升级软件:使
2023-10-18

编程热搜

目录