28 | 从工作场景出发,寻找炫酷且有效的命令行工具
下载APP
关闭
渠道合作
推荐作者
28 | 从工作场景出发,寻找炫酷且有效的命令行工具
2019-10-28 葛俊 来自北京
《研发效率破局之道》
课程介绍
讲述:葛俊
时长18:51大小17.26M
你好,我是葛俊。今天,我继续和你分享命令行工具的使用。
在上一篇文章中,我与你介绍了命令行环境中的终端、Shell,以及远程连接的设置,解决了环境配置的问题。今天,我们再来看看具体的命令行工具的使用技巧。我会根据常见的工作场景来组织这些工具,因为优化工作流程、提高效率才是学习工具的真正目的。
从我的经验来看,开发人员最常见的、使用命令行的场景主要包括两个:
日常的操作,比如文件夹跳转、处理和搜索文件夹和文件内容、查看和管理系统信息;
开发中常见的工作,比如 Git 的使用、API 调试、查看日志和网络状况等。
我会重点与你分享这些场景中有哪些推荐工具以及使用技巧。而至于这些工具如何安装的内容,网络上已经有很多了,我就不再详细描述了。
日常操作中的工具和技巧
关于日常操作,Linux/Unix 系统已经自带了一些工具,另外还有些产生已久、为我们所熟悉的工具。不过,要更高效地完成工作,我们还有更强大的工具可以选择。
第一个场景:列举文件夹和文件,查看文件
列举文件的默认工具是 ls。除此之外,一个常用的工具是 tree,可以列出文件夹的树形结构:
另外,还有些比 tree 更方便的工具,比如 alder 和 exa。exa 尤其好用,优点包括:
默认就有漂亮的颜色显示,并且不同种类文件颜色不同;
可以像 ls 一样显示当前文件夹,也可以像 tree 一样显示树形结构。
另外,exa 还支持对文件状态显示的加强。
比如,添加–git 选项,exa 会显示文件的 git 状态,在文件名的左边,用两个字母来表示文件在工作区和 Git 暂存区的状态。其中,N 表示新文件,M 表示文件修改等。exa 的显示和 git status 命令输出的简单对比,如下图所示。
再比如,使用–extend 选项显示文件的额外信息。
再比如,使用 group-directories-first 选项,先显示文件夹再显示文件。
至于查看文件,Linux 默认的工具是 cat。相比起来,bat 是一个更好用的替代品,除高亮显示外,还可以显示 Git 的更改状态。
第二个场景:查找并打开文件,进行查看和编辑
一个常用的办法是,使用上面提到的工具来列出文件名,然后使用 grep 进行过滤查看,或者 VIM 进行查看和编辑。比如,使用命令
可以得到当前文件夹中的所有 index.md 文件。
命令中,tree 的参数 -I,表示排除文件夹 node_modules;tree 的参数 -f,表示显示文件时包含文件路径,方便你拷贝文件的全名;grep 的参数 -C3,代表显示搜索结果 3 行的上下文。
我们也可以使用 VIM 代替 grep,进行更复杂的查找和编辑工作。我可以把 tree 的输出传给 VIM,然后在 VIM 中查找 index.md,使用 n 跳到下一个搜索结果,使用 VIM 命令 gF 直接打开文件,进行编辑后使用\bd 命令关闭这个 index.md 文件。然后,用同样的方式查找并编辑第二、三、四个 index.md,从而实现对当前文件夹下每一个 index.md 文件的查看和修改:
事实上,这正是一个很常见的命令行工作流:把某一个命令的输出传给 VIM,输出里包含有其他文件的完整路径,比如上面例子中 index.md 的路径,然后在 VIM 里使用 gF 命令查看并处理这些文件。我推荐你也尝试使用这种工作流。
另外,在上面的例子中,我使用 tree 命令来列举文件名。其实,很多时候我们使用 find 这种专门用来查找文件的命令会更加方便。不过,我今天要介绍的不是 find,而是它的一个替代品,即 fd。
我推荐 fd 的原因主要有 3 个:
语法比 find 简单;
fd 默认会忽略.gitignore 文件里指定的文件;
忽略隐藏文件。
后两点对开发者来说非常方便。比如,我在搜索时,并不关心 node_modules 里面的文件,也不关心.git 文件夹里的文件,fd 可以自动帮我过滤掉。
另外,fd 高亮显示,速度也很快。至于对查找到的文件进行编辑,跟上面提到的方法一样,用管道(Pipe)传给 VIM,然后使用 gF 命令即可。
另外,关于查找文件内容的工具 grep,我常用的一个替代品是 RipGrep(rg)。跟 fd 类似,它也很适合开发者,有如下 4 个特点:
默认忽略.gitignore 文件里指定的文件;
默认忽略隐藏文件;
默认递归搜索所有子目录;
可以指定文件类型。
比如,使用 rg tags 就可以方便地查找当前目录下所有包含 tags 的文件。它的查找速度非常快,显示也比 grep 要漂亮:
第三个场景:文件夹之间跳转
关于文件夹间的跳转,在 Bash 中有 cd 和 dirs 命令;在 Zsh 和 Fish 中,可以使用文件夹名字直接跳转;另外,Zsh 支持..、...和-等别名,用来分别跳转到父目录、父目录的父目录,以及目录历史中上一次记录,而不需要写 cd。
接下来,我与你介绍几个新的工具来支持更快的跳转。
实际上文件夹的跳转,有两种常见的情况:
一种是,快速跳转到文件夹跳转历史中的某条记录,即之前曾经去过的某个文件夹;
另一种是,快速找到当前文件夹中的某个子文件夹,并跳转过去。
对于第一种情况,常用的工具有两个,一个是 fasd,另一个是 z,它们差别不是特别大。我用的是 z,具体用法是:z 会按照访问频率列出最近访问过的文件夹,并使用字符串匹配的方式让你实现快速跳转。
比如,用 z dem来进行匹配和自动补全,找到我想去的 demo 文件夹,回车直接完成跳转。同时,我也可以用 z dem< 回车 > 直接跳转。
对于第二种情况,即快速定位某个子文件夹,我介绍一个超级酷的工具 fzf。本质上讲,fzf 是一个对输入进行交互的模糊查询工具。它的使用场景非常多,文件夹的跳转只是一个应用。所以,我还在再后面文章做更多的详细讨论。
安装好 fzf 之后,你就可以使用 Ctrl+T 进行文件夹的交互式查询,或者使用 Alt+C 进行文件夹跳转。
比如,我想跳转到 src/component 文件夹中,可以输入 Alt+C,fzf 就会列出当前文件夹下的所有文件夹。比如,我输入 com,没输入其他字符,fzf 会更新匹配到的文件夹,这时可以使用 Ctrl+P、Ctrl+N 进行上下选择,按下回车就可以进入选中的文件夹。
第四个场景:文件管理
系统自带的文件管理工具有 cp、mv、rsync 等。这里,我再介绍一些更方便的工具。
首先是一个用来重命名文件的小工具,叫作 vidir。顾名思义,vidir 就是 VI 来编辑目录的。具体使用方法很简单,vidir 命令后面接一个文件夹时,vidir 会打开 VIM,VIM 里面列举该文件夹中所包含的文件和子文件夹,然后使用 VIM 的命令来修改文件和文件夹的名字之后保存退出。这时,vidir 会自动帮助我们完成对文件和文件夹的重命名。
vidir 之所以使用 VIM 来修改文件,是因为 VIM 功能强大,修改非常方便。另外,vidir 也可以从管道接收文件夹和文件的列表。比如,我想把当前文件夹下所有前缀为 index 的文件,都在文件名前添加“new-”。这时,我可以使用命令 fd | vidir -。
这样,fd 命令会把当前文件夹下所有文件名传给 vidir。然后,vidir 打开 VIM,我们在 VIM 界面中修改文件名即可。如下所示的录屏图片中,包括了使用 VIM 的重复命令. 的技巧。
另外一组方便进行文件管理的工具是,命令行的文件管理器,即使用键盘命令在终端界面进行文件夹跳转、查看文件和移动文件等操作。这种命令行界面上的 UI 叫做 TUI(Terminal UI)。十多年前的 Borland 终端 IDE,就是这一类工具的翘楚,使用熟练之后效率会很高。
TUI 的文件管理器我用过 3 个:Midnight Commander (以下简称 mc)、Ranger 和 nnn。
mc 是两个窗口的文件管理器。如果你使用过 Windows Commander(Total Commander)的话,你就会对它的用法很熟悉。重要的命令有:使用 tab 进行两个窗口的切换、使用 F4 进行编辑、使用 F5 进行拷贝、使用 F9 进入菜单、使用 F10 退出。
我提供了一张录屏图片,简单演示了在一台远端服务器上使用 mc 进行多文件拷贝和编辑,并通过菜单修改显示主题的场景。
Ranger 和 nnn 是单窗口的文件管理器。Ranger 稍微有一点延迟,所以我一般使用 nnn。因为是单窗口,所以与我们平时在 GUI 中使用的文件管理器比较相似。
比如,在拷贝文件的时候,需要先进入文件所在文件夹,选择文件,然后进入目标文件夹,再使用拷贝命令把文件拷贝过去。我在录屏中演示了在 nnn 中进行文件夹的跳转、创建,文件的选择、拷贝,使用系统工具打开当前文件,查看帮助等功能。
总的来说,这 3 个工具中我使用最多的是 nnn。跟 mc 相比,它最大的好处是快捷键设置跟 VIM 一致,不需要大量使用功能键 F1~F12。
开发中常见的工作
Git
命令行中的 Git 工具,除了原生的 Git 之外,常见的还有 tig、grv、lazygit 和 gitin。
我常用的是 tig。因为在 tig 中,我可以方便地进行查看改动、产生提交、查看历史(blame)等操作,功能非常强大。比如,在查看文件改动时,我们可以方便地使用命令 1 有选择性地把一个文件中改动的一部分添加到一个提交当中,实现第 26 篇文章中提到的 git add -p 的功能。
另外,我还可以通过 tig 快捷地查看一个文件的历史信息。
关于这两个功能的使用,你可以参考下面的录屏图片。
Web 访问
我常用的 Web 访问工具是 HTTPie,是 curl 命令的一个补充。HTTPie 的强项在于,专门针对 HTTP 协议,所以可以做到格式简单、易用性强两点。
而 curl 的优势,则包括功能强大、支持多种协议和基本所有服务器上都有预装。
关于这两个工具,我的建议是,curl 肯定要学,HTTPie 如果用得到也值得花时间学习。
对 JSON 进行处理
在命令行对 JSON 文本进行处理,最常见的工具是 jq。它能够对 JSON 进行查询和修改处理,功能很强大。
举一个查询的例子,我们有这样一个 person.json 文件列举某个人的详细信息:
可以方便地使用 cat person.json | jq .”对 JSON 进行格式化输出,
以及使用 jq ".terms[0].office"命令查询他的第一个工作任期的办公室地址。
但,jq 存在的最大问题是,它有一套自己的查询处理语言。如果使用 jq 的频次没那么高的话,很难记住,每次都要去查帮助才可以。
针对这种情况,有人设计了另一种类似的工具,直接使用 JavaScript 作为查询处理语言,典型代表是 fx 和 jq.node。这,就大大方便了使用 JavaScript 的开发者,因为可以使用已经熟悉了的语法。
比如,对于上个案例的 JSON 文件,我可以方便地在 fx 工具中使用 JavaScript 的函数 filter() 进行过滤查询。
查找、关闭进程
通常情况下,我们使用 kill 和 pkill,来查找和关闭进程。但,使用 fzf 之后,我们可以方便地进行交互式的查找目标进程。具体使用方法是,输入 kill,fzf 就会提供一个交互式的界面供你查找目标进程,然后回车确认即可。
在命令行上进行交互式的操作,非常爽,我推荐你一定要试试。
查看日志文件
关于查看日志文件的工具,我推荐 lnav。它比 tail -F 要方便、强大得多,有很多很棒的功能,包括:
支持很多日志格式,比如 syslog、sudo、uWSGI 等,并可以根据格式高亮显示;
支持多个日志同时显示,并用不同颜色区分;
支持正则表达式进行过滤等。
命令行本身的实用技巧
关于命令行的使用技巧,有两个非常值得一提:一个是!$,另一个是!!。
第一个!$,代表上一个命令行的最后一个参数。比如,如果我上一条命令使用
下一步我想为它产生一个备份文件,就可以使用!$:
第二个常用的是!!,表示上一个命令的完整命令。最常用的场景是,我先拷贝一个文件,发现没有权限,需要 sudo,下一步我就可以用 sudo !! 来用 sudo 再次运行拷贝命令。
小结
今天,我与你介绍了很多工具。使用工具提高研发效能,最关键的是找到真正常用的工作场景,然后去寻找对应的工具来提高效率。
需要注意的是,只有重复性高的工作,才最适合使用命令行工具;否则,用来适应工具的时间,可能比节省下的时间还要多。这,是命令行的一个基本特点。
最后,我把今天与你讨论的 Linux/Unix 系统自带工具和替代工具,整理为了一张表格,以方便你复习:
思考题
不知道你有没有注意到,在录屏中我多次用到了一个叫作 tldr 的工具。你知道它是什么作用吗?
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!
分享给需要的人,Ta购买本课程,你将得18元
生成海报并分享
赞 7
提建议
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
上一篇
27 | 命令行:不只是酷,更重要的是能提高个人效能
下一篇
29 | 1+1>2,灵活的工具组合及环境让你的工作效率翻倍
精选留言(11)
- 我来也2019-10-28今天又学了些新东西. 以前这些工具都是自己慢慢摸索,或机缘巧合看了某个文章提到了,自己才会去尝试下. 现在一篇文章就接触这么多,还是蛮方便的. bat和fzf这个确实不错. 特别是fzf,简单配置后更强大. 我Mac下的几个配置可以给你们试试: ``` # 设置样式 可以直接预览文件 也可以用快捷键执行简单的操作 export FZF_DEFAULT_OPTS="--height 40% --reverse --border --prompt '>>>' \ --bind 'ctrl-j:preview-down,ctrl-k:preview-up,ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort,?:toggle-preview' \ --header 'C-j/k: preview down/up, C-y: copy, ?: toggle preview' \ --preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -C {}) 2> /dev/null'" export FZF_CTRL_T_OPTS=$FZF_DEFAULT_OPTS export FZF_CTRL_R_OPTS="--preview 'echo {}' --preview-window hidden:wrap --bind '?:toggle-preview'" # 让Ctrl-R直接执行选中的命令 fzf-history-widget-accept() { fzf-history-widget zle accept-line } zle -N fzf-history-widget-accept bindkey '^X^R' fzf-history-widget-accept ```展开
作者回复: fzf 的preview功能的确好用。推荐大家可以试试 @我来也 的配置。 fzf 的github页面上有一个视频链接,介绍fzf在命令行和VIM中的使用,很不错。也推荐大家看看。
共 6 条评论4 - 我愿化身石桥→_→2019-11-24老师,为什么我使用 fd 文件夹 | vim - 使用 gF 跳转会报错 E37: No write since last change
作者回复: 这是因为VIMI默认要求当前文件保存之后才能切换到其他文件。改变这个设置,请使用 :set hidden
3 - Neo2019-10-30如何递归搜索当前文件夹内所有文件的全文
作者回复: rg 默认就可以: > rg <needle> 传统的办法是用find找到文件,然后用xargs把文件名传给grep命令: > find . -type f | xargs grep <needle> 当然你可以用fd代替find,rp代替grep: > fd -t f | xargs rg <needle> needle 是你要找的字符串。
3 - P小二2019-10-28tldr就是太长不想看,想给我一个例子让我运行起来。常用的场景都给例子出来,让人一看就懂。 不知道会不会介绍thefuck。 macos中finder用打开zsh并跳转到当前finder目录,也是很频繁的需求,有个Go2shell的工具也挺好用。展开
作者回复: thefuck 我倒是装了,不过用的很少 :) 跳转到当前finder目录,我用的是cdf命令https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/osx 这个plugin还有几个其他命令也还不错。推荐看看
1 - D2021-01-16问下老师,文章中文件重命名的 vidir 工具,在哪下的 ? 我在mac上 brew install vidir 提示 No available formula or cask with the name "vidir".
- 紫色天空2020-07-20这些工具是Linux自带的吗,担心写成shell自动化的时候找不到
作者回复: 大部分都需要自己安装
- 技术修行者2020-02-26收藏先,后面慢慢实践。
- 我来也2020-02-13温故知新。 看到文中的 sudo !! 我有话要说。 我平常遇到这种情况,都是用两个快捷键: 1。Ctrl+p 切换到上条命令。 2。Ctrl+a 移动到行首 剩下的就是sudo了展开
作者回复: 另外sudo!! <Tab> 在zsh中可以自动补全,更放心一些 :)
- 苦行僧2019-11-18fzf 非常好用,还有一个是vim的浏览器插件
作者回复: fzf 真的是厉害。再来一个例子: https://ddrscott.github.io/blog/2017/fzf-dictionary/
- 我来也2019-10-30今天又找了个小技巧,跟文中的命令`fd index.md | vim -`功能类似. 1.`fd index.md | xargs -o vim` 遇到带空格的文件名会出问题 2.`find . index.md -exec vi {} +` 可以正确处理带空格的文件名 这两个命令都是直接打开指定文件, 就不用再用`gF`打开当前某一行的文件了. 参考: https://superuser.com/questions/335999/how-can-i-edit-all-the-files-returned-by-find-in-vi-in-linux展开
作者回复: 如果我们需要打开每个文件,的确更方便!另外一个办法是还可以使用fzf的preview功能 :)
- Robert小七2019-10-28文章的工具是否可以列出包名,我试着用yum安装,几乎都是找不到了用的包!
作者回复: 我一般也都是问也搜索具体的安装方式的 😅 你先试试搜索,找不到的告诉我,我们一起看看
共 2 条评论