如果你长期在 Windows 和 WSL 之间来回搬运项目文件,大概率遇到过这种场景:把代码从 Windows 桌面复制到 WSL 的 ~/workspace 后,目录里冒出一大批名字带 :Zone.Identifier 的琐碎小文件。我第一次碰见时还以为是项目被什么同步工具污染了,打开文件看到 [ZoneTransfer] ZoneId=3 之后才反应过来,这是 Windows 对下载文件打下的安全标记,到了 Linux 侧后被文件系统差异硬生生变成了一个真实文件。这类文件本身不耽误你直接改代码,但会污染 git 状态、干扰构建和部署、让 IDE 索引膨胀,堆积多了非常恶心。这篇文章我从现象讲到原理,再给一套可以直接抄走的清理脚本和几条源头治理思路,希望对你有用。
1. Zone.Identifier 到底是什么,为什么会跟着文件进 WSL
1.1 NTFS 上的“小纸条”:备用数据流和下载标记
Windows 的 NTFS 文件系统有个不太被大众注意的特性:一个文件除了我们平时看到的主数据流(比如 .txt 里的正文内容)之外,还可以挂载多个备用数据流(Alternate Data Stream,简称 ADS)。你可以把一个文件想象成一本笔记本,正文是主数据流,笔记本侧面的口袋和夹层是备用数据流。正常使用中你只关心正文,但侧面口袋里可能被塞了一张便签,便签上记录着“这个文件是从哪里来的”。
浏览器或者 Windows 安全模块在下载文件时,往往会往这个“侧面口袋”里塞一张便签,内容大致长这样:
ini复制[ZoneTransfer]
ZoneId=3
HostUrl=https://example.com/software/installer.exe
这张便签在 Windows 里有个专门叫法:Zone.Identifier。它是“Mark of the Web”机制的一部分,用来标记文件来自互联网、局域网还是本机。ZoneId=3 代表来自 Internet,也就是我们最常见的“从浏览器下载的文件”;ZoneId=0 是本机生成;ZoneId=4 通常代表“从其他不信任位置获取”。Windows 资源管理器的文件属性里如果有“安全”提示或者“解除锁定”按钮,背后起作用的就是这个标记。
这个
