golang实现一个linux命令ls命令(命令行工具构建)
希望2023可以听到这些话:
恭喜你得到了这份工作
恭喜你的建议被采用了
恭喜你被录取了
恭喜你的考试顺利通过了
恭喜你上岸了
恭喜你升职了
恭喜你加薪了
恭喜你体检结果一切正常
在这篇文章下面许个愿吧!
ls 命令
要实现ls
,首先先我们复习一下ls
命令。
ls
不加任何参数,表示查询当前目录下的文件/文件夹
ls
后面加上路径,列出所有,不包含隐藏文件/文件夹
ls -a
列出所有,包括以.
开头的隐藏文件
此命令还有很多功能,这一节的重点是命令行程度的编写,就实现上面四个。
os.Args 读取参数
定义如下,一个数组。该数组长度由参数个数决定,第一个参数为程序本身,后面为参数列表。
var Args []string
比如ls -l
,Args=["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 folderfile1 file2
看,我们已经简单的实现了。但我们会发现,要使用-
开头的参数时,用os.Args
这个还需要手写更多复杂逻辑去判断输入的到底是路径,还是其他参数,于是下一个包登场了。
pflag
昨天的每日一Go
已经讲了flag
包,pflag
包与 flag
包的工作原理甚至是代码实现都是类似的,下面是 pflag
相对 flag
的一些优势:
支持更加精细的参数类型:例如, flag
只支持uint
和uint64
,而pflag
额外支持uint8
、uint16
、int32
等类型。
支持更多参数类型: ip
、ip mask
、ip net
、count
、以及所有类型的slice
类型。
兼容标准 flag
库的Flag
和FlagSet
:pflag
更像是对flag
的扩展。
原生支持更丰富的功能:支持 shorthand
、deprecated
、hidden
等高级功能。
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$ ./lsfolder 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 -hUsage 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
里面,他就会成为一个系统命令,方便你做更多的事情,比如备份数据库之类的动作,提高你的运维效率。
引用
命令行工具
极客时间
本文由 mdnice 多平台发布
golang实现一个linux命令ls命令(命令行工具构建)相关推荐
- Linux关于ls的命令有哪些,关于linux中ls意思,LS什么大全
[导读]linux中ls是什么意思,LS什么,下面就是语录说小编整理的唯美句子,来看看吧! linux中ls是什么意思,LS什么意思 ls是单词list的简写,Linux有些命令的名字大多采用单词简写 ...
- Linux中ls -l命令展示信息详解
Linux中ls -l命令展示信息详解 在Linux系统中,ls -l命令是用以列表的形式来查看当前目录下的文件或目录,下面就让我们一起来看看展示的信息是什么意思吧 以CentsOS7为例子 [roo ...
- Linux 下 ls -l 命令执行显示结果的每一列含义 图解 (附带ls命令详解)
参考来源:https://www.runoob.com/linux/linux-comm-ls.html 用ls -l命令查看某一个目录会得到一个7个字段的列表. 第1行:总计(total) Tota ...
- gulp-cli命令安装出错_一个牛逼的数据库操作命令行工具:mycli
GitHub 可谓各种神器都有,今天发现一个操作数据库的命令行工具,可以自动补全和语法高亮,以前在终端敲 SQL 的时候,你不仅要记住表名.字段名,各种函数都需要记住才能敲出一条完整的语句来,否则就是 ...
- linux下ls -l命令(即ll命令)查看文件的显示结果分析
在linux下使用"ls -l"或者"ls -al"或者"ll"命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意 ...
- linux命令结果中获取某一列,Linux中 ls -l 命令显示结果中的每一列的含义
简单解释下: 1.第一列颜色框:文件类型列,这里简单描述几种常见类型,d表示目录文件,例如dr-xr-xr-x:-表示普通文件,例如-rwxrwxr-x. 2.第二三四列颜色框:文件权限列,因为lin ...
- 使用 SAP UI5 CLI 命令行工具构建和运行 SAP UI5 应用
源代码 Github 地址:https://github.com/wangzixi-diablo/ui5-for-kyma 本地路径:C:\Code\frontend-ui5-mssql 本文介绍 S ...
- Vmware安装Centos及Linux的介绍,命令
一.vmware 1.vmware虚拟机 VMWare是一个"虚拟PC"软件.它使你可以在一台机器上同时运行二个或更多Windows.DOS.LINUX系统. VMWa ...
- linux dmesg信息哪来的,linux中的dmesg命令简介
今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...
最新文章
- 【从零学习OpenCV 4】Mat类构造与赋值
- IIS部署ASP.Net Core 502.5错误和解决
- MySQL索引效率对比_mysql下普通索引和唯一索引的效率对比
- C ++中线程的简单示例
- 第22节 三个败家子(22)——霸王无敌
- 大道至简 23种模式一点就通
- zookeeper 在 windows 下配置伪集群环境
- java-第九章-循环结构进阶-三个班级每班4位同学成绩大于85的算平均分.
- 如何把ACCESS转成SQL数据库
- ES6 Symbol的应用场景
- 关于Paxos 幽灵复现问题的看法
- 单用户修改root密码--centos6.2
- Kotlin 循环控制(七)
- 导致Tomcat启动过程缓慢的原因及解决方法
- 微信的APP支付开发,服务端和支付端的问题
- 关于3.3V稳压芯片
- uni-app 基础之常用组件(2)基础内容
- 淘宝中影响产品SEO权重的因素有哪些?
- 移动端:苹果开发者账号Apple Developer Program
- svn修改提交日志信息
热门文章
- 善用搜索引擎--使用Volley上传multipart/form-data数据
- 无人驾驶之车道线检测(一)
- 做机器视觉哪个软件好?
- Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721)
- 常德计算机专修学院学校视频,“未来”常德学校长啥样? 武陵区第一小学告诉你!(内附航拍视频)...
- Python——字符串、列表、元组、字典、公用方法(day03)
- leaks Android内存泄露,安卓-内存泄露总结
- 300美元目标已设定,阿里巴巴何时能够达成?
- 使用 jsDoc 提升我们的开发效率
- App启用MultiDex功能