希望2023可以听到这些话:

  • 恭喜你得到了这份工作
  • 恭喜你的建议被采用了
  • 恭喜你被录取了
  • 恭喜你的考试顺利通过了
  • 恭喜你上岸了
  • 恭喜你升职了
  • 恭喜你加薪了
  • 恭喜你体检结果一切正常

在这篇文章下面许个愿吧!

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 folderfile1 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$ ./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命令(命令行工具构建)相关推荐

  1. Linux关于ls的命令有哪些,关于linux中ls意思,LS什么大全

    [导读]linux中ls是什么意思,LS什么,下面就是语录说小编整理的唯美句子,来看看吧! linux中ls是什么意思,LS什么意思 ls是单词list的简写,Linux有些命令的名字大多采用单词简写 ...

  2. Linux中ls -l命令展示信息详解

    Linux中ls -l命令展示信息详解 在Linux系统中,ls -l命令是用以列表的形式来查看当前目录下的文件或目录,下面就让我们一起来看看展示的信息是什么意思吧 以CentsOS7为例子 [roo ...

  3. Linux 下 ls -l 命令执行显示结果的每一列含义 图解 (附带ls命令详解)

    参考来源:https://www.runoob.com/linux/linux-comm-ls.html 用ls -l命令查看某一个目录会得到一个7个字段的列表. 第1行:总计(total) Tota ...

  4. gulp-cli命令安装出错_一个牛逼的数据库操作命令行工具:mycli

    GitHub 可谓各种神器都有,今天发现一个操作数据库的命令行工具,可以自动补全和语法高亮,以前在终端敲 SQL 的时候,你不仅要记住表名.字段名,各种函数都需要记住才能敲出一条完整的语句来,否则就是 ...

  5. linux下ls -l命令(即ll命令)查看文件的显示结果分析

    在linux下使用"ls -l"或者"ls -al"或者"ll"命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意 ...

  6. linux命令结果中获取某一列,Linux中 ls -l 命令显示结果中的每一列的含义

    简单解释下: 1.第一列颜色框:文件类型列,这里简单描述几种常见类型,d表示目录文件,例如dr-xr-xr-x:-表示普通文件,例如-rwxrwxr-x. 2.第二三四列颜色框:文件权限列,因为lin ...

  7. 使用 SAP UI5 CLI 命令行工具构建和运行 SAP UI5 应用

    源代码 Github 地址:https://github.com/wangzixi-diablo/ui5-for-kyma 本地路径:C:\Code\frontend-ui5-mssql 本文介绍 S ...

  8. Vmware安装Centos及Linux的介绍,命令

    一.vmware ​ 1.vmware虚拟机 ​ VMWare是一个"虚拟PC"软件.它使你可以在一台机器上同时运行二个或更多Windows.DOS.LINUX系统. ​ VMWa ...

  9. linux dmesg信息哪来的,linux中的dmesg命令简介

    今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...

最新文章

  1. 【从零学习OpenCV 4】Mat类构造与赋值
  2. IIS部署ASP.Net Core 502.5错误和解决
  3. MySQL索引效率对比_mysql下普通索引和唯一索引的效率对比
  4. C ++中线程的简单示例
  5. 第22节 三个败家子(22)——霸王无敌
  6. 大道至简 23种模式一点就通
  7. zookeeper 在 windows 下配置伪集群环境
  8. java-第九章-循环结构进阶-三个班级每班4位同学成绩大于85的算平均分.
  9. 如何把ACCESS转成SQL数据库
  10. ES6 Symbol的应用场景
  11. 关于Paxos 幽灵复现问题的看法
  12. 单用户修改root密码--centos6.2
  13. Kotlin 循环控制(七)
  14. 导致Tomcat启动过程缓慢的原因及解决方法
  15. 微信的APP支付开发,服务端和支付端的问题
  16. 关于3.3V稳压芯片
  17. uni-app 基础之常用组件(2)基础内容
  18. 淘宝中影响产品SEO权重的因素有哪些?
  19. 移动端:苹果开发者账号Apple Developer Program
  20. svn修改提交日志信息

热门文章

  1. 善用搜索引擎--使用Volley上传multipart/form-data数据
  2. 无人驾驶之车道线检测(一)
  3. 做机器视觉哪个软件好?
  4. Shiro反序列化漏洞利用详解(Shiro-550+Shiro-721)
  5. 常德计算机专修学院学校视频,“未来”常德学校长啥样? 武陵区第一小学告诉你!(内附航拍视频)...
  6. Python——字符串、列表、元组、字典、公用方法(day03)
  7. leaks Android内存泄露,安卓-内存泄露总结
  8. 300美元目标已设定,阿里巴巴何时能够达成?
  9. 使用 jsDoc 提升我们的开发效率
  10. App启用MultiDex功能