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

目录
  • ls 命令
  • os.Args 读取参数
  • pflag
  • 小结

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命令行工具的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Go 创建命令行工具的方法

    前言 最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼"真香". 但现阶段相对来说还是 Python 写的多一些,偶尔还得回炉写点 Java :自然对 Go 也谈不上多熟悉. 于是便利用周末时间自己做个小项目来加深一些使用经验.于是我便想到了之前利用 Java 写的一个博客小工具. 那段时间正值微博图床大量图片禁止外链,导致许多个人博客中的图片都不能查看.这个工具可以将文章中的图片备份到本地,还能将图片直接替换到

  • 一文秒懂Go 编写命令行工具的代码

    前言 最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼"真香". 但现阶段相对来说还是 Python 写的多一些,偶尔还得回炉写点 Java :自然对 Go 也谈不上多熟悉. 于是便利用周末时间自己做个小项目来加深一些使用经验.于是我便想到了之前利用 Java 写的一个博客小工具. 那段时间正值微博图床大量图片禁止外链,导致许多个人博客中的图片都不能查看.这个工具可以将文章中的图片备份到本地,还能将图片直接替换到

  • Golang执行cmd命令行的方法

    1. Golang执行系统命令使用 os/exec Command方法: func Command(name string, arg ...string) *Cmd 第一个参数是命令名称,后面参数可以有多个命令参数. cmd := exec.Command("ls", "-a") if stdout, err := cmd.StdoutPipe(); err != nil {     //获取输出对象,可以从该对象中读取输出结果     log.Fatal(err)

  • Golang 基于 flag 库实现一个简单命令行工具

    目录 前言 flag 库 FlagSet 需求拆解 实现 weather flag 天气数据打印 获取源数据 数据转换 运行效果 小结 前言 Golang 标准库中的 flag 库提供了解析命令行选项的能力,我们可以基于此来开发命令行工具. 假设我们想做一个命令行工具,我们通过参数提供[城市],它自动能够返回当前这个[城市]的天气状况.这样一个简单的需求,今天我们就来试一下,看怎样实现. flag 库 Package flag implements command-line flag parsi

  • 玩转Go命令行工具Cobra

    目录 1 简介 2 安装 2.1 安装Cobra-cli脚手架工具 2.2 在项目中下载Cobra依赖 3 使用方式 3.1 Hello World 3.2 开发自己的Cli命令 3.3 规则和扩展使用 4 小总结 不知大家有没有在使用Git命令.Linux的yum命令.Go命令.Maven命令的时候感觉到非常的酷,比如你刚刚拿到一个Go的开源项目,初始化时只需要输入go mod tidy进行对依赖的下载,或者是git clone xxx之后拉下来一个GitHub上的项目,mvn package

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

    目录 ls 命令 os.Args 读取参数 pflag 小结 ls 命令 要实现ls,首先先我们复习一下ls命令. ls不加任何参数,表示查询当前目录下的文件/文件夹 ls后面加上路径,列出所有,不包含隐藏文件/文件夹 ls -a列出所有,包括以.开头的隐藏文件 此命令还有很多功能,这一节的重点是命令行程度的编写,就实现上面四个. os.Args 读取参数 定义如下,一个数组.该数组长度由参数个数决定,第一个参数为程序本身,后面为参数列表. var Args []string 比如ls -l,A

  • 详解golang执行Linux shell命令完整场景下的使用方法

    目录 1. 执行命令并获得输出结果 2. 将stdout和stderr分别处理 3. 异步执行命令 4. 执行时带上环境变量 5. 预先检查命令是否存在 6. 两个命令依次执行,管道通信 7. 按行读取输出内容 8. 获得exit code 1. 执行命令并获得输出结果 CombinedOutput() 执行程序返回 standard output and standard error func main() { cmd := exec.Command("ls", "-lah

  • linux 中ls命令详解

    ls命令用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件. 语法 ls(选项)(参数) 选项 -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出): -A:显示除影藏文件“.”和“..”以外的所有文件列表: -C:多列显示输出结果.这是默认选项: -l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列: -F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文

  • linux中ls命令使用详解

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等.ls 命令在日常的linux操作中用的很多! 1. 命令格式: ls [选项] [目录名] 2. 命令功能: 列出目标目录中所有的子目录和文件. 3. 常用参数: -a, –all 列出目录下的所有文件,包括以

  • Linux常用ls, alias基础命令详解

    ls命令 作用:列举目录文件信息( list directory content ) 格式:ls [option] [file] 1,命令不跟任何选项与目录,表示列举当前目录的文件信息 ghostwu@dev:~$ ls Desktop examples.desktop linux Pictures python Videos Documents git_test Music project software Downloads info php Public Templates 2,ls -l

  • Linux 中ls命令的使用详细介绍

    目录 1,通过ls列出文件或目录 2,通过ls列出文件的长列表 3,通过ls列出所有文件包括隐藏文件 4,通过ls列出文件或者目录以/结尾 5,通过ls命令跳过所有者的详细信息 6,ls命令列出文件的索引 7,通过ls命令显示文件通过逗号分隔 8,通过ls列出文件或目录的uid和gid 9,通过ls列出文件和目录通过相反的顺序 10,通过ls列出当前目录下的文件以及子目录下的文件 11,通过ls列出最近修改的文件或目录 12,通过ls列出文件的大小 13,通过ls命令列出指定文件的详情 14,通

  • Linux 中的Setfacl命令

    setfacl命令是用来在命令行里设置ACL(访问控制列表).在命令行里,一系列的命令跟随以一系列的文件名. 选项 -b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留. -k,--remove-default:删除缺省的acl规则.如果没有缺省规则,将不提示. -n,--no-mask:不要重新计算有效权限.setfacl默认会重新计算ACL mask,除非mask被明确的制定. --mask:重新计算有效权限,即使ACL mask被明确指定

  • linux创建用户useradd命令代码示例

    一,adduser与useradd命令二者的关系  代码示例: [root@larrywen opt]# type adduser adduser is /usr/sbin/adduser [root@larrywen opt]# type useradd useradd is /usr/sbin/useradd [root@larrywen opt]# which useradd /usr/sbin/useradd [root@larrywen opt]# which adduser /usr

  • linux下用tar命令将当前目录下文件按子目录压缩归档的实现

    日常工作中,我们常常需要用tar命令将历史文件压缩归档,再删除源文件,以便节省空间.如果压缩归档成一个文件,就比较简单,用一条命令即可,如命令:tar -czf bak2013.tgz t2013/*就将t2013目录下所有的文件打包成一个压缩文件.但这样的文件往往太大,使用起来也不方便,这时如果能将t2013目录下的文件按子目录打包,一个子目录一个文件,这样就方便使用了. 实现这样的功能当然不可能是一条命令,用下面这个脚本就可以了: # get directory name subdir=`l

  • MySQL在Linux系统中隐藏命令行中的密码的方法

    在命令行中输入命令并不是一个好主意,会造成安全问题.但是如果你决定去写一个应用,而这个应用需要在命令行中使用密码或者其他敏感信息.那么,你能通过以下方法禁止系统的其他用户轻易的看到这些敏感数据 呢?,类似MySQL在ps命令下隐藏密码. 假设我这里系统里两个用户,一个是root ,一个是dabu .测试系统为centos 6.5在按照下面的步骤做: [root@dabu.info ~]#su dabu #切换到dabu这个账号 [dabu@dabu.info ~]$cd ~ #切换到dabu的h

随机推荐