一些零散的计算机知识

如题。

Bash

bash批量更改文件名

背景是我想把minerU转换的物理学课件文件名最后的序列号删了,这些文件名形如 MinerU_xxx_12345.md。前缀通过访达自带的重命名功能可以搞,后缀要正则匹配,访达不支持,问dpsk,得到以下bash代码:

1
2
3
4
5
6
7
for f in *; do
base=${f%_*} # 删除最后一个下划线及其右侧
ext=${f##*.} # 提取扩展名
if [[ $f != $base.* ]]; then
mv "$f" "$base.$ext"
fi
done

下面写点讲解:

  • *:通配符,用于文件名匹配。例如 echo * 会打印当前目录下所有非隐藏文件的名称列表。
  • $:用于引用变量内容。如 export name="vivo50" 之后,echo $name 或者 echo ${name} 会打印 vivo50
  • %<pattern>:去除从尾开始的最短匹配。例如 export f="11_22_33",那么 ${f%_*} 就是 11_22。%%<pattern> 就是最长匹配。
  • ##<pattern>:去除从头开始的最长匹配。
  • []:相当与 test 命令,不打印东西,返回状态码。比如执行 [ "abc"="abc" ] (注意不用 ==)之后,echo $? 会打印 0。单层括号不支持匹配,双层支持。
    • ?:储存状态码的变量,每条指令执行完之后都会被覆盖更新
  • mv:移动文件,因为在同目录下,相当于重命名。

让 Mac 不休眠

1
caffeinate

然后保持终端窗口开启。

让 Mac 不熄屏

1
2
3
# power management settings
# -a: all 对所有供电模式生效
sudo pmset -a disablesleep 1

用完后记得再设置为 0.

查 pid 和查网络连接

1
2
3
4
5
6
7
8
9
10
11
12
# process grep;
# -f: --full 匹配完整命令行;
# -l: --list-name 除了 PID,也把进程名/命令一起打印出来,不加这个参数只返回 pid
pgrep -fl "Google Chrome"

# list open file;
# -i: internet, 查看网络连接
# -n: numeric,不转换为域名
# -P: Port num,输出端口号,而不是 https 之类
# -p: pid
# -a: and,所有条件取交
lsof -i -nP -p <pid> -a

写点讲解:

  • 查 pid 也可以这样:ps aux | grep Chrome
  • lsof 还可以接受 -iTCP:8080 ,-sTCP:ESTABLISHED 这样的 flag,用于筛选连接类型、端口号和连接状态
    • 这样的参数风格是 lsof 自己实现的,它会自己解析成 -i TCP 8080 这样子,但用的时候不能这么写

一般 pgrep 会返回一堆 pid,这时候可以

1
lsof -nP -i -a -p "$(pgrep -f 'Google Chrome.app' | paste -sd , -)"

其中 paste 用来横向合并文本:

  • -s: serial,同一个文件的不同行,横向合并
  • -d: delimiter
  • -: 从标准输入 (stdin) 读取数据

比如若有一个文件 a.txt 的内容是

1
2
3
a
b
c

那么执行 paste -s -d , a.txt 的结果是

1
a,b,c

查看目录大小

1
2
3
4
# disk usage
# -h: human-readable,以 MB 等格式显示
# -d: depth
du -h -d 1

Python

正则表达式

需要先引入re库:

1
import re

主要就是以下几个函数:

1
2
3
4
5
6
7
8
9
10
11
12
# 返回列表,包含所有匹配的子串。若有捕获组则只返回组内的子串,有多个捕获组返回元组列表。对于有'\n'的字符串,逐行匹配。
re.findall(pattern, string)

# 返回首个匹配的子串对应的 Match 对象,找不到则返回 None
match = re.search(pattern, string)
match.group(0) # 返回整个匹配的子串
match.group(1) # 返回第一个捕获组
match.group(1,3) # 返回第一个和第三个捕获组组成的元组
match.groups() # 返回所有捕获组组成的元组

# 把 string 中符合规则的所有子串替换成 repl。若 pattern 中有捕获组,repl 中可以用 \1 等引用
re.sub(pattern, repl, string)

下面记点正则表达式的东西:

  • ^<pattern> 表示从头匹配
  • <pattern>$ 表示从尾匹配,re.search() 加上这两个,很大程度上能代替 re.match() 和 re.fullmatch()
  • \w 匹配单词字符,如数字、字母、下划线等
  • \b 匹配单词开始前或结尾后的空字符 (Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of word characters.)
1
2
re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
# ['foot', 'fell', 'fastest']

其他用法参见这里。

NumPy

注意以下方法及其特性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 生成从 start 到 stop 的等距的有 num 个元素的一维数组,默认包含 stop
np.linspace(start, stop, num, endpoint=True)

# 三个参数是形状相同的 array (或者可以广播)
np.where(condition, yes, no)

# 默认升序,不指明 axis 参数则在 flattened 上面做排序,返回一维数组,下面的操作都有一样的逻辑
np.sort(arr)

# 求中位数,注意没有 arr.median() 的用法
np.median(arr)

# 求标准差
np.std(arr)

# 求最大值的下标
A.argmax()

线性代数部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 解线性方程组
np.linalg.solve(A,b)

# 求逆矩阵
np.linalg.inv(A)

# 求矩阵行列式
np.linalg.det(A)

# 求特征值
np.linalg.eigvals(A)

# 计算向量点积
a.dot(b)

# 求向量或矩阵的范数,对于向量,默认2范数,对于矩阵,默认f范数
np.linalg.norm(A)

# 求最小二乘解,返回 (x, residuals, rank, singular_values) 元组
np.linalg.lstsq(A,b)

pip

pip install -e . 以可编辑方式安装当前目录下的包。需要有.toml文件。

conda

1
2
3
4
conda env config vars XXX="XXX" # 设置环境变量
conda env config vars unset XXX # 删除环境变量
conda env config vars list # 查看

Git

取消追踪目录

1
git rm -r --cached <dir>
  • -r 表示递归
  • --cached 参数是关键,它告诉 Git 只移除索引中的记录,不动工作区的文件

记得相应地修改 .gitignore。 git rm 和 git add 是部分对偶的,都会改变暂存区,只是 git rm 若无 --cached 会删除工作区的文件。

修改远程仓库

1
2
git remote -v # 查看远程仓库
git remote set-url <remote-name> <repo-url> # remote-name 默认是 origin

理解远程仓库

假设本地处于 main 分支,其上游分支配置为 origin/main ,跟踪远程仓库的 main 分支。

逻辑上可以认为 origin/main 就是本地的一个分支

git fetch 会拉取远程的所有分支,更新所有远程跟踪分支 origin/* 的状态。

git pull --rebase 相当于 git fetch && git rebase origin/main

git pull --no-rebase 相当于 git fetch && git merge origin/main

git pull --ff-only 相当于 git fetch && git merge --ff-only origin/main,这也是 git pull 的默认行为。

切换到远程分支

1
2
git branch -a # 列出所有分支
git switch -c dev --track origin/dev # 重点是这个 --track 参数
  • git switch -c dev:创建 dev 分支并立刻切换到 dev

回退

git reset HEAD~1 将当前分支指针移动到上一个 commit,默认使用 --mixed 模式,因此工作区内容保持不变,但暂存区会重置。如果被回退的 commit 已经推送到远程,普通 push 会因为不是 fast-forward 而被拒绝;若强制 push,则会改写远程历史,因此共享分支通常不建议这么做。

git revert HEAD 不修改已有历史,而是创建一个新的 commit,其修改内容与 HEAD commit 的修改相反。

cherry-pick

1
git cherry-pick <commit-sha256>

把指定 commit 的更改弄到当前分支来,前提是这个更改不依赖当前分支不存在的状态。

Excel

复制多个单元格的文字

Excel选中单元格复制,在别的地方粘贴出来会是图片,若是单个单元格,应该在上方编辑栏复制。若是多个单元格,可以使用
=TEXTJOIN(" ", TRUE, A1:B4) 这样的函数,选中这个函数所在的单元格,光标移动到上方编辑栏,按下 F9 即可复制文字内容。

Chrome

截长图

  1. F12
  2. Ctrl + Shift + P
  3. 输入 screenshot
  4. 选择 capture full size screenshot

一些零散的计算机知识
https://wtx17.github.io/2026/06/13/一些零散的计算机知识/
作者
wtx
发布于
2026年6月13日
更新于
2026年11月6日
许可协议