美文网首页
golang实现一个linux命令ls命令(命令行工具构建)

golang实现一个linux命令ls命令(命令行工具构建)

作者: 机智的程序员小熊 | 来源:发表于2023-01-11 22:26 被阅读0次

希望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 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里面,他就会成为一个系统命令,方便你做更多的事情,比如备份数据库之类的动作,提高你的运维效率。

引用

本文由mdnice多平台发布

相关文章

  • 简单命令行

    写几个简单命令行的使用 一、ls ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打...

  • #我的笔记#Python语法

    Linux命令行以$开始,比如$ls,$pythonPython命令行以>>>开始,比如>>>print 'Hel...

  • Zookeeper简单使用

    zookeeper命令行操作 运行 zkCli.sh –server 进入命令行工具 使用 ls 命令来查看当前...

  • vue实践笔记

    安装方式 直接用script工具 命令行工具 实践指南 环境准备vue命令行工具 可以方便的命令行工具构建一个we...

  • 【进阶系列】前端开发环境构建(五)JS -- Grunt

    2.2 Grunt——js项目命令行构建工具 Grunt是一个基于任务的JavaScript项目命令行构建工具,...

  • 命令行基础

    The Command Line 命令行 在Linux或者OS X中,输入命令行的界面叫做terminal。 ls...

  • C/C++ 参数解析 getopt_long 详解

    疑问? 在linux使用中会发现很多命令行程序都要参数如ls -a、ls -a /,参数解析是怎么实现的? 解惑 ...

  • Python高级学习一 Linux篇

    Linux Linux目录速查表 Linux常用命令 ls命令通配符 ? * [] \ help 命令 ls -...

  • Linux基本命令

    Linux命令: 第一章 命令行操作及常用命令使用 一 登录和退出Linux系统1.$ls -al该命令可列出当前...

  • Linux xargs 命令解析

    基本使用 xargs 是 Linux 系统中的一个命令行工具,它可以读取标准输入并将其作为参数构建新的命令并执行。...

网友评论

      本文标题:golang实现一个linux命令ls命令(命令行工具构建)

      本文链接:https://www.haomeiwen.com/subject/pasicdtx.html