在家用电脑处理大量文件时,比如整理照片、批量重命名下载内容,或者备份家庭资料,经常要用到Shell命令。可有时候敲完命令,光标一直闪,等半天没反应,挺耽误事。其实稍微调整下写法,速度能明显提升。
减少管道和子进程
很多人习惯把命令串成一长串,像这样:
cat file.txt | grep "error" | awk '{print $2}' | sort | uniq
每加一个竖线|,系统就要开个新进程。进程来回传数据,耗时间。改成用awk一次性处理,能省不少开销:
awk '/error/ {print $2}' file.txt | sort -u
sort -u 比先sort再uniq更干脆。
善用内置功能,少调外部命令
Bash本身就能做些简单操作,没必要总靠echo、sed、cut这些外援。比如取变量长度,别这么写:
len=$(echo ${var} | wc -c)
直接用内置语法更快:
len=${#var}
类似地,字符串截取、替换都可以用${var//pattern/replacement}搞定,比sed轻快得多。
避免在循环里频繁调用命令
想遍历一堆日志文件查关键词,有人会这么写:
for file in *.log; do
lines=$(grep "failed" "$file" | wc -l)
echo "$file: $lines"
done
每个文件都单独启动grep和wc,文件一多就卡。合并处理更高效:
grep "failed" *.log | cut -d: -f1 | sort | uniq -c
一条命令扫完所有文件,结果也清晰。
用并行处理代替串行等待
如果要压缩多个大文件,一个接一个压太慢:
for f in *.txt; do
gzip "$f"
done
换成并行方式,充分利用CPU空闲时间:
for f in *.txt; do
gzip "$f" &
done
wait
后台运行每个gzip任务,整体时间能缩短一大截。家里老电脑也能跑出新效率。
选择更快的工具替代品
有些命令天生就比同类快。比如用ripgrep(rg)代替grep,速度快很多,尤其搜大目录时:
rg "重要发票" ~/Documents
安装后几乎零配置,正则支持还更友好。类似地,fd比find简洁快速,适合日常查找。
优化不是非得改代码结构,很多时候换种写法、换个工具,原来等一分钟的事,十秒就搞定。家里的电脑不用升级硬件,也能用得更顺手。