电脑装了win10/ubuntu 24.04双系统,Ubuntu主要用于开发,但日常还需要经常用到wps,linux自带的字体就不太够用了。所以从本机Win10 的C:\Windows\Fonts拷过来所有文件。这篇把筛选、安装、验证、踩坑一次写完,命令都能直接复制。环境是 Ubuntu 24.04 + Wayland,Debian 系通用。
一句话结论
把.ttf/.ttc装到/usr/local/share/fonts/下的一个子目录,跑一遍fc-cache -f就行。192 个.fon、几个 Windows 元数据文件直接跳过。嫌 sudo 麻烦可以放~/.local/share/fonts/,代价是snap 应用看不到。(因为我自己安装过字体,fonts文件夹比win10原版的文件数应该多一些)
| 项目 | 数值 |
|---|---|
| 源文件 | 555 个 / 582 MB |
| 实际安装 | 354 个(336 个 ttf + 18 个 ttc) |
| 新增字体家族 | 255 个 |
| 系统字体条目 | 2286 → 2711 |
| 安装位置 | /usr/local/share/fonts/win10/ |
为什么不能一股脑全装
先把扩展名摊开看:
| 扩展名 | 数量 | 能不能用 |
|---|---|---|
.ttf | 230 | 能 |
.TTF | 107 | 能,但容易漏 |
.ttc | 18 | 能(字体集合,一个文件多个字体) |
.fon | 192 | 不能 |
.CompositeFont | 4 | 不能 |
.xml/.txt/.ini/.dat | 各 1 | 不能 |
坑一:大写.TTF
我第一次写的是for f in *.ttf,跑完一数只有 229 个,心里还觉得挺顺。回头ls才发现里面躺着一堆ALGER.TTF、STKAITI.TTF、SIMLI.TTF这种全大写的文件名。
Linux 的 shell glob 区分大小写,*.ttf匹配不到*.TTF。一下就漏了 107 个,华文系列和一堆西文字体全在里头。
两种改法,任选:
shopt-snocaseglob# 让 *.ttf 同时匹配 .TTF# 或者find.-maxdepth1-iname'*.ttf'坑二:mstmc.ttf是个坏文件
它混在 ttf 堆里,看名字像字体,4 KB 大小。file一看:
mstmc.ttf: data不是字体,就是一段随机数据。装进去只会白占位置,直接在筛选阶段排除。
坑三:192 个.fon根本装不了
这些是 Windows 3.x 时代的位图字体,file的输出很直白:
8514fixe.fon: MS-DOS executable, NE for MS Windows 3.x (DLL or font)NE 是可执行文件格式,不是字体文件。fontconfig 不认,Linux 下的应用也不会去加载。唯一的用处是让老 Windows 程序在低分辨率下显示界面文字,跟现在的需求完全无关。
顺带提一句,GlobalMonospace.CompositeFont这类文件也不是字体本体,是 Windows 的复合字体定义(XML),里面只是指向别的字体,一起跳过。
装哪儿:用户目录还是系统目录
两种都能让字体被识别,区别在覆盖面。
| 方案 | 路径 | 影响范围 |
|---|---|---|
| 用户级 | ~/.local/share/fonts/ | 当前用户、正常安装的应用 |
| 系统级 | /usr/local/share/fonts/ | 所有用户、所有应用,含 snap / 系统服务 / Wine |
如果机器上只跑原生应用,用户级完全够用,还不用 sudo。但这台机器装了 brave、chromium、firefox、thunderbird、notepad++、android-studio 一堆 snap 包,用户级装完它们照样找不到字体。
动手
1. 筛选并暂存
SRC=/path/to/FontsSTAGE=/tmp/win10-fontsmkdir-p"$STAGE"cd"$SRC"shopt-snullglob nocaseglobforfin*.ttf;do["${f,,}"="mstmc.ttf"]&&continuecp-a--"$f""$STAGE/"doneforfin*.ttc;docp-a--"$f""$STAGE/";done${f,,}是 bash 的小写转换,用来忽略文件名大小写,防止MSTMC.TTF这种漏网。
2. 装之前先验一遍
别等装完才发现有坏文件,先用fc-scan过一遍:
cd"$STAGE"forfin*;do[-z"$(fc-scan--format'%{family}'--"$f"2>/dev/null)"]&&echo"坏文件:$f"done354 个文件跑下来没有一个报错,一共识别出 425 个字体条目(.ttc一个文件里可能有好几个字体)。
3. 安装
sudoinstall-d-m755/usr/local/share/fonts/win10sudocp-a/tmp/win10-fonts/. /usr/local/share/fonts/win10/sudochown-Rroot:root /usr/local/share/fonts/win10sudochmod644/usr/local/share/fonts/win10/*sudofc-cache-ffc-cache -f是强制重建缓存。不加-f的话它会比对时间戳,有时候新文件反而不进缓存,直接强制最省事。
4. 验证
fc-match"微软雅黑"fc-match"宋体"fc-match"仿宋_GB2312"fc-match"楷体"fc-match"Segoe UI"正常输出长这样:
msyh.ttc: "微软雅黑" "Regular" simsun.ttc: "宋体" "常规" 仿宋_GB2312.ttf: "仿宋_GB2312" "Regular" simkai.ttf: "楷体" "Regular" segoeui.ttf: "Segoe UI" "Regular"左边是文件,右边是匹配到的字体。想看得更清楚就加格式化参数,直接输出家族名和完整路径:
fc-match"微软雅黑"-f'%{family}|%{file}\n'# 微软雅黑,Microsoft YaHei|/usr/local/share/fonts/win10/msyh.ttcfc-list|grep-cwin10# 看这批字体贡献了多少条目# 425一个.ttc文件里可能打包好几个字体,所以 354 个文件对应 425 个条目,这属于正常现象,不是重复安装。
重名字体怎么处理
系统里本来就装了msttcorefonts,里面有 Arial、Times New Roman、Courier New。这次又从 Win10 拷了一份同名的,装完就是两套并存。
不用手动删。fontconfig 会自己挑,而且实测挑的是新装的那份:
Arial -> /usr/local/share/fonts/win10/arial.ttf Times New Roman -> /usr/local/share/fonts/win10/times.ttf Courier New -> /usr/local/share/fonts/win10/cour.ttffc-cache全程没有报重复告警。如果你更想保留msttcorefonts的版本,把 win10 目录里那几个同名文件删掉再刷缓存就行。
几个实际会碰到的问题
装完了应用里还是找不到字体?
重启那个应用。字体缓存在启动时读,开着窗口不会自己刷新。终端也要重开。
snap 应用看不到?
确认装的是系统目录,不是~/.local/share/fonts。然后sudo fc-cache -f再试。
细明体查出来是 Noto Serif CJK?
这次源文件里只有mingliub.ttc,里面是細明體-ExtB/新細明體-ExtB,属于扩展 B 集,本来就没有基础版 MingLiU。用 Noto 兜底是正常的,不算装失败。
fc-cache不报错但某个字体就是查不到?
单独体检:
fc-scan--format'%{family}\n'-- /usr/local/share/fonts/win10/xxx.ttf能输出家族名说明文件没问题,问题多半在应用侧(比如它按 PostScript 名而不是家族名去匹配)。
要卸载怎么办?
sudorm-rf/usr/local/share/fonts/win10sudofc-cache-f干净利落,不留残留。
完整脚本
#!/bin/bash# 用法: sudo bash install-win10-fonts.shset-euopipefailSRC=/tmp/win10-fontsDEST=/usr/local/share/fonts/win10["$(id-u)"-ne0]&&{echo"请用 sudo 运行";exit1;}[-d"$SRC"]||{echo"暂存目录不存在:$SRC";exit1;}install-d-m755"$DEST"cp-a"$SRC"/."$DEST"/chownroot:root"$DEST"/*chmod644"$DEST"/*chmod755"$DEST"fc-cache-f"$DEST">/dev/null fc-cache-f>/dev/nullecho"文件数:$(find"$DEST"-maxdepth1-typef|wc-l)"fornamein"微软雅黑""宋体""仿宋_GB2312""楷体""Segoe UI""Calibri";doprintf'%-14s -> %s\n'"$name""$(fc-match"$name"-f'%{family}')"doneecho"完成,重启应用后生效。"最后
这次装完新增 255 个字体家族,微软雅黑、宋体、黑体、楷体、仿宋/仿宋_GB2312、等线、华文全家桶、微软正黑体、Yu Gothic、Malgun Gothic 都在,西文的 Segoe UI、Calibri、Cambria、Consolas、Cascadia 也齐了。LibreOffice 打开带「宋体」「仿宋_GB2312」的文档不用再替换字体,WPS 和浏览器里也能正常选。
真正花时间的不是命令,是那 107 个大写.TTF和一个混进来的坏文件。装之前多跑一次fc-scan,能省掉后面「为什么这个字体没生效」的排查。
提醒:这些是微软的版权字体,自己机器上用没问题,别打包分发。本文由ai辅助完成,如果你有同样问题,可以把本文交给你的ai agent 工具,希望可以帮你节省时间。