☰
CLI-Anything:用命令行把重复工作变成自动化流程
2026/9/28 16:25:20 网站建设 项目流程

CLI-Anything不是一个具体的软件包,也不是某个GitHub仓库的名字。它是我过去几年在终端里反复打磨出的一套工作习惯:尽量把任何一件原本要在GUI里点来点去的事,拆成一条可以重跑、可以改参数、可以塞进自动化流程的命令。这个理念把我从大量重复点击里解放出来,也让很多“以为自己必须用某个软件”的事情,变成了几秒钟就能完成的操作。这篇文章就是想系统分享一下,CLI到底能覆盖到什么程度、我是怎么把常见场景搬进终端的,以及新手从哪里上手最不容易踩坑。

不管你是写代码的、做运维的,还是平时要处理大量文档和数据的非程序员,我都建议先花十分钟读完。这套方法不要求你会编程,只需要愿意把“鼠标点击”换成“敲回车”,就足够开始受益。

1. 先搞清楚“CLI-Anything”到底在说什么

1.1 一次“把任务降维成文本流”的实践

我第一次对CLI产生“万物皆可命令行”的冲动,是在处理一批两百多个文件的时候。当时需要把所有文件名里的日期格式从20240101_report.txt改成20240101-报告.txt,同时把里面的一部分内容做批量替换。打开文件资源管理器一个个改,至少得忙一个下午。后来我只用了一行命令,不到几秒钟就全部完成。那一刻我才意识到,很多看似“必须用鼠标”的活儿,本质上只是在操作一串文本——文件名是文本,文件内容是文本,连排序、筛选、合并也都是文本处理。

CLI-Anything的核心思路,就是把任意复杂的任务拆成三个阶段:输入阶段、处理阶段、输出阶段。输入可以是一个文件、一批文件名、一段URL返回的数据,甚至是系统命令的执行结果;处理就是过滤、提取、转换、拼接;输出就是把结果保存成文件、打印到屏幕,或者作为下一条命令的输入继续加工。这种“管道思维”几乎能覆盖所有重复性工作。

1.2 它解决了什么问题,适合谁用

CLI-Anything解决的最大问题,是“操作不可复现”。GUI操作点完就没了,换了机器、换了人,一切从头再来;而命令天然有记录、有参数、有日志,保存成一个脚本,就等于把一次复杂操作变成了可重复执行的流程。第二个问题是效率,批量操作越重,命令行的优势越明显;第三个问题是资源占用,几十MB的GUI工具能做的事,一个两KB的脚本也能做到,运行时长还经常是毫秒级。

适合用这套思路的人,主要包括三类。第一类是开发者,需要频繁操作文件、执行构建、拉取和处理数据;第二类是运维和技术支持,要在多台机器上做重复配置和排查;第三类是内容工作者、数据分析师、编辑,有大量文档、表格、多媒体文件的批处理需求。核心的判断标准很简单:如果一件事你做超过两次,并且步骤完全一样,它就值得被写成一条命令或一个小脚本。

2. 基础姿势:把终端变成你的瑞士军刀

2.1 五条几乎每天都会用的管道套路

不管你要用CLI做什么,最后万变不离其宗的就是几个基础命令再加上管道符|。管道就是把左边命令的输出,当成右边命令的输入,让一串工具像流水线一样协作。先列几条最实用、也最安全的组合套路。

第一条,查找文件并批量处理。比如找出当前目录下所有超过100MB的文件:find . -type f -size +100M,如果想看它们各占多大,再加个-exec ls -lh {} \;,或者直接配合du、sort来排序。这类工作用图形化文件管理器反而很难一眼看清。

第二条,批量改名。最常见的搭配是rename命令加正则表达式,比如把所有.jpeg后缀改成.jpg:rename 's/\.jpeg$/\.jpg/' *.jpeg。注意不同系统里rename的语法不一样,在Linux发行版里多是Perl版本,在macOS上则是另外一个实现,用之前先--help确认一下。

第三条,批量压缩和解压。tar -czf archive.tar.gz ./folder一键打包,tar -xzf archive.tar.gz一键解包。很多人不知道,tar还能只解压其中一个文件:tar -xzf archive.tar.gz path/to/single/file,这在处理大压缩包时非常实用。

第四条,文本提取与统计。比如统计一个日志文件里“error”出现了多少次:grep -c "error" app.log,或者找出出现次数最多的IP:awk '{print $1}' app.log | sort | uniq -c | sort -rn | head -20。这一串看起来复杂,实际拆开就是提取第一列、排序、去重计数、倒序、取前二十。

第五条,把处理结果写回文件或再交给下一个程序。command > output.txt是覆盖写,command >> output.txt是追加写,command | tee output.txt则是“输出到文件的同时也打到屏幕上”,调试的时候特别好用。这五条套路能覆盖日常八成以上的终端需求。

2.2 文件与文本处理的三个高频组合

我举个工作中常遇到的场景:一批.log文件里有需要的信息,想把其中所有“用户ID + 操作时间”格式的行抽出来存到一个CSV里。命令可以是这样:

grep -h "用户操作" *.log | sed 's/.*用户ID[::]\([0-9]*\).*时间[::]\([0-9-: ]*\).*/\1,\2/' > actions.csv

这里-h是让grep不要显示文件名前缀,sed负责把匹配到的两段内容提取出来重排成CSV格式。第一次写下这种命令时可能很痛苦,但写完一次,下次换一批文件,直接重跑就行。这就是CLI-Anything的魅力:它不是教你怎么操作某个软件,而是教你怎么操作数据本身。

另一个高频场景是批量替换。比如一个项目里所有配置文件的数据库地址从旧域名切到新域名:

find ./config -type f -name "*.conf" -exec sed -i 's/old-db\.example\.com/new-db\.example\.com/g' {} \;

注意-i是原地修改,执行前最好先做一轮grep -r看看命中范围,避免误伤。我的习惯是先不加-i跑一遍,确认输出结果无误,再加-i执行真实改动。这个过程叫“先dry-run再动真格”,是CLI操作里最重要的安全习惯。

2.3 五分钟上手的最小工作流示例

如果你想现在就试一下CLI-Anything,我建议从一件简单但用途广泛的事开始:批量重命名一批图片文件,从IMG_001.jpg改成2024-vacation-001.jpg。

mkdir -p ~/test_rename cd ~/test_rename touch IMG_{001..010}.jpg for f in IMG_*.jpg; do mv "$f" "2024-vacation-${f#IMG_}"; done

这里for f in ...是循环遍历文件,${f#IMG_}是Shell的参数扩展,意思是把变量f里开头的IMG_去掉。跑完ls看一下,你会发现文件名已经全部改好了。整个过程不需要安装任何软件,只要有个终端就能完成。这就是第一课:一个命令解决一个重复劳动,把它记住,接着解决下一个。

3. 拓展到开发之外:CLI不是程序员的专利

3.1 用命令行管理日常事务

很多人以为CLI只跟代码有关,但实际上“任何事”三个字真的不是夸张。日常事务管理完全可以用命令行来做,而且比专门装一个待办软件的负担小得多。我自己的做法是建一个todo目录,里面放inbox.md、today.md、project-xxx.md几个纯文本文件,然后配几条别名来操作。

比如在终端里快速记一条待办:

echo "- [ ] $(date +%Y-%m-%d): 检查服务器证书" >> ~/todo/today.md

想看看今天要做什么:cat ~/todo/today.md。想按优先级筛选:grep -E "重要|紧急" ~/todo/today.md。这套做法的核心优势在于,文件是纯文本,可以被任何工具操作,也不会被某个软件绑架——你哪天不想用这个组织了,数据还是那些markdown文件,换个工具照样能读。

记账也是一样。日常支出逐笔记在一个CSV里,再用几行awk统计每月总花费,效果并不比记账App差,关键是数据完全握在自己手里。对于“只是想快速记一笔”的轻量需求,命令行反而是负担最小的入口。

3.2 用命令行处理媒体和文档

另一个被低估的领域是媒体处理。图片压缩、格式转换、裁剪尺寸,这些在GUI里通常要打开Photoshop或者看图软件折腾半天的操作,命令行工具经常一步搞定。比如用ImageMagick把一批图片统一改成1200像素宽并压缩质量:

for img in *.png; do convert "$img" -resize 1200x -quality 85 "${img%.png}.jpg"; done

ffmpeg在音视频处理上也是一把好手。把Mov格式的视频转成MP4同时压缩体积:

ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4

-crf参数控制质量,数值越小质量越高、文件越大,23算是体积和画质的平衡点。剪辑片段、截取音频、批量转码,这些在“视频处理软件”里要导来导去的操作,在ffmpeg里就是几行参数的事。

文档批量操作也有成熟方案。pandoc可以把Markdown一键转成PDF、Word、HTML,而且排版质量比很多在线转换器更稳定。PDF的合并、拆分、提取页面,可以用pdfunite、pdftk这类命令行工具完成。我处理一本几百页的电子书拆分,用GUI软件卡了半天,用命令行三秒解决——这就是工具选择带来的真实差距。

3.3 用命令行快速生成数据简报

工作里经常有一种需求:把一堆原始数据整理成一段人能直接读懂的简报。比如某个业务日志里有访问数据,想快速看看各时段的分布。假设数据是JSON格式,用jq处理非常顺手。先看一个最简单的用法:

cat data.json | jq '.items | length'

这里是统计items数组的元素个数。再配合sort、uniq、awk,就能完成很多所谓“数据分析报表”的工作。我之前处理一份三千行的销售记录,需要统计每个业务员的订单数和总金额,最终用的指令就是一行awk加一行sort,完全没有打开表格软件。这些命令可能读起来不太“像正事”,但实际价值非常大——它把“看数据”变成了“查数据”,而且查询结果可以反复执行。

4. 实操过程:从零搭一个“CLI-Anything”工具箱

4.1 工具选型参考:不追求多,追求顺手

如果你想认真把这套思路用到工作中,不需要装一大堆工具。我建议走“最小可用集合”路线,装一个用一个,用熟了再加下一个。下面这份清单是我的个人推荐,每个都是经过大量实际场景验证的:

工具主要用途为什么值得装
ripgrep(rg)极速全文搜索比grep快几个量级,默认尊重.gitignore,输出带颜色和行号
jqJSON数据提取与转换处理API返回、日志JSON、配置文件几乎是必备
fzf模糊查找配合历史命令、文件路径选择,大幅提升交互效率
tmux终端复用断开重连会话不丢失,服务器操作必备
rename/mmv批量改名正则批量改名比手写循环快得多
ranger终端文件管理器保留“文件树浏览”的直觉,同时不离开终端
pandoc文档格式转换Markdown到Word/PDF等,转换质量很稳定

我特别想强调一点:不要在第一天就安装所有热门CLI工具。否则你会陷入“装了一堆、一个都没吃透”的状态,反而觉得命令行很繁琐。我的建议是,每当你遇到一次“用鼠标做得很烦”的操作,就去查一次“这个能用命令行做吗”,查到什么学什么。Toolkit是长出来的,不是配出来的。

4.2 实操案例一:批量清理下载目录并归档

假设你的下载文件夹里堆积了各种PDF、图片、压缩包、安装包,想按类型自动归类到对应子目录。这是一个非常典型、非常安全的上手案例。

cd ~/Downloads mkdir -p 图片 视频 压缩包 文档 安装包 mv -v *.jpg *.png *.gif 图片/ mv -v *.mp4 *.mov *.mkv 视频/ mv -v *.zip *.tar.gz *.rar 压缩包/ mv -v *.pdf *.docx *.txt 文档/ mv -v *.dmg *.exe *.deb 安装包/

就这么几行,每次清理时执行一次,就完成了归档工作。但这只是一个起点。你可以把它写成一个脚本~/bin/tidy.sh,外加一层防护逻辑:先创建一个未识别目录,把没有被规则匹配到的文件放进去,再打印一份汇总清单。这样就不会出现“命令跑完,文件不知道去哪了”的惊恐状况。把脚本加上chmod +x,之后终端里敲一下tidy就能触发整套清理。

4.3 实操案例二:把Markdown批量导出成PDF并合并

内容创作者常遇到需要把多篇Markdown文章合成一份PDF交付的情况。这个需求用pandoc加一行命令就能完成。先生成单个文档:

pandoc article1.md -o article1.pdf --pdf-engine=weasyprint

然后把多份PDF合并成一个文件:

pdfunite article1.pdf article2.pdf article3.pdf final.pdf

如果文章里包含代码块,建议在生成PDF时指定--highlight-style参数,比如--highlight-style=tango,代码高亮会舒服很多。中文字体问题也很常见,我需要特别说明:本机缺少中文字体时,PDF会出现大量乱码或方块,解决方法是确认字体存在,或者在调用weasyprint引擎时把字体配置为系统中已安装的中文字体。这个坑我刚开始时反复踩,后来干脆写进脚本里,生成前自动检查字体是否存在。

4.4 实操案例三:备份重要目录并保留最近7天版本

备份是我认为CLI最能体现“生活化价值”的场景之一。一行tar命令实现目录快照:

tar -czf ~/backups/config_$(date +%Y%m%d_%H%M%S).tar.gz ~/.config/git

配合一句查找并清理旧备份的命令,就能做到“只保留最近7天”:

find ~/backups -name "config_*.tar.gz" -mtime +7 -delete

这里-mtime +7表示修改时间在7天以前的文件,再加上-delete直接删除。我建议把这两行合并且在cron里定时跑,比如每天凌晨三点执行。这样,一天结束前所有重要的配置都有了自动快照,出问题随时能回滚。这不是什么惊天动地的技术,但日积月累救了我很多次。

5. 实战中踩过的坑与排查技巧

5.1 常见问题速查表

CLI入门的最大障碍不是命令记不住,而是出了问题不知道怎么排查。我把自己和身边同事碰到的高频问题整理成了一张速查表,按“症状→原因→解法”排列,遇到类似问题直接对号入座。

症状常见原因解决思路
提示command not found工具未安装或不在PATH里先which 命令名确认是否存在,再检查安装方式
中文文件名乱码终端编码和文件编码不一致设置export LANG=zh_CN.UTF-8,或者用ls时确认输出
执行rm后立刻后悔没有确认直接删除平时多用trash命令替代rm,删除前先列出清单
管道操作后看不到输出某些命令在非交互模式下没有颜色/进度加--color=always或用unbuffer强制输出
脚本里变量为空导致操作跑偏变量没有加引号或未判空变量一律加双引号"$var",使用前先set -u
Ctrl+C中断后命令还在跑子进程没有收到中断信号用pkill -f精确结束相关进程

上表里最值得反复强调的就是第一类:命令找不到。很多人的第一反应是“我不会用”,但实际上大概率只是安装路径没进PATH。与其死记每个工具参数,不如先掌握一个通用解法:which <命令>、type <命令>、echo $PATH。这三条能解决一半的CLI入门困惑。

5.2 我给新手的五条避坑建议

第一,永远先dry-run。任何批量修改类的命令,第一次执行都要带上--dry-run、--print这类只打印不改动的参数,或者先用echo包住真实命令看输出。能确认输出符合预期,再动真格。这不是胆小,是职业素养。

第二,路径带空格是最大的隐藏炸弹。很多人写rm -rf /media/disk/My Folder,会直接被Shell拆成两个路径。所有包含变量的路径,必须加引号:"$folder"。所有在脚本里的命令,一律假设路径可能带空格。

第三,不要害怕写脚本,但脚本要“慢起步”。先写三行解决眼前问题,再慢慢加上错误处理、日志、参数校验。我最早用的“备份脚本”只有一行tar,后来才加了删除旧备份、记录日志逻辑。脚本像一个活的文档,要持续演进。

第四,学会翻历史记录。终端里按Ctrl+R可以反向搜索历史命令,按上下箭头可以找回最近输入。你会发现很多操作根本不用重新敲,直接从历史里改一个参数就能复用。

第五,把“怕搞坏系统”的恐惧放下一点。日常命令里真正有破坏性的命令并不多,只要不在生产服务器上乱跑rm -rf /、不随意curl | sh,多数情况下最坏结果就是删了个文件、改错了文件名,都有办法恢复。用命令行和学骑车一样,光看说明书永远学不会。

5.3 关于安全性的个人原则

我要认真说一段安全性建议。CLI工具给我们的自由很大,自由越大,越需要自己的约束规则。我现在给自己定了三条铁律。

第一,绝不盲目执行来源不明的完整脚本。别人分享的curl xxx | sh这种一键安装方式,除非我能完整看懂脚本内容,否则宁可手动下载、解压、检查、安装。命令行是透明的,但前提是你真的去看。

第二,不做没有备份的批量删除。删除类操作前,先打包备份或移动到临时目录。移动比删除安全,因为可以反悔;删除之后再做反悔,只能借助文件恢复工具,成功率没有保证。

第三,定时给脚本做版本管理。我自己所有常用脚本都存在一个git仓库里,每次改动都提交。这样即使某次改坏了,也可以一键回到上一个可用版本。CLI-Anything的“Anything”也包括管理你自己的工具本身。

6. 最后再分享一个小技巧

如果你看完这篇文章只记住一件事,我希望是:把“重复做过两次的事”变成“一条命令”。不需要一次搞定所有,只需要每次多解决一个小问题。我那套至今还在用的记账、备份、文件归档工作流,就是这么一段一段长出来的。命令行没有想象中那么高门槛,它只是换了一种和计算机打交道的方式——更直接、更坦诚,出错时也会明明白白告诉你错在哪。希望你能从今天就开始,试着把你手边最烦的那件重复劳动,变成你的第一条CLI命令。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询