为什么文件名要小写?

作者: 阮一峰

日期: 2017年2月10日

上周,《中文技术文档写作规范》加入了文件的命名规则。

"文件名建议只使用小写字母,不使用大写字母。"

"为了醒目,某些说明文件的文件名,可以使用大写字母,比如READMELICENSE。"

网友看见了,就提问为什么文件名要小写?

说实话,虽然这是 Linux 传统,我却从没认真想过原因。赶紧查资料,结果发现四个很有说服力的理由,支持这样做。

下面就是这四个理由。另外,文后我还会发布一条前端培训的消息。

一、可移植性

Linux 系统是大小写敏感的,而 Windows 系统和 Mac 系统正好相反,大小写不敏感。一般来说,这不是大问题。

但是,如果两个文件名只有大小写不同,其他都相同,跨平台就会出问题。

  • foobar
  • Foobar
  • FOOBAR
  • fOObAr

上面四个文件名,Windows 系统会把它们都当作foobar。如果它们同时存在,你可能没办法打开后面三个文件。

另一方面,在 Mac 系统上开发时,有时会疏忽,写错大小写。


// 正确文件名是 MyModule.js
const module = require('./myModule');

上面的代码在 Mac 上面可以运行,因为 Mac 认为MyModule.jsmyModule.js是同一个文件。但是,一旦代码到服务器运行就会报错,因为 Linux 系统找不到myModule.js

如果所有的文件名都采用小写,就不会出现上面的问题,可以保证项目有良好的可移植性。

二、易读性

小写文件名通常比大写文件名更易读,比如accessibility.txt就比ACCESSIBILITY.TXT易读。

有人习惯使用驼峰命名法,单词的第一个字母大写,其他字母小写。这种方法的问题是,如果遇到全部是大写的缩略词,就会不适用。

比如,一个姓李的纽约特警,无论写成NYPoliceSWATLee还是NyPoliceSwatlee,都怪怪的,还是写成ny-police-swat-lee比较容易接受。

三、易用性

某些系统会生成一些预置的用户目录,采用首字母大写的目录名。比如,Ubuntu 在用户主目录会默认生成DownloadsPicturesDocuments等目录。

Mac 系统更过分,一部分系统目录也是大写的,比如/Library/Audio/Apple Loops/

另外,某些常见的配置文件或说明文件,也采用大写的文件名,比如MakefileINSTALLCHANGELOG.Xclients.Xauthority等等。

所以,用户的文件都采用小写文件名,就很方便与上面这些目录或文件相区分。

如果你打破砂锅问到底,为什么操作系统会采用这样的大写文件名?原因也很简单,因为早期 Unix 系统上,ls命令先列出大写字母,再列出小写字母,大写的路径会排在前面。因此,如果目录名或文件名是大写的,就比较容易被用户首先看到。

四、便捷性

文件名全部小写,还有利于命令行操作。比如,某些命令可以不使用-i参数了。


# 大小写敏感的搜索
$ find . -name abc
$ locate "*.htmL"

# 大小写不敏感的搜索
$ find . -iname abc
$ locate -i "*.HtmL"

另外,大写字母需要按下 Shift 键,多多少少有些麻烦。如果文件名小写,就不用碰这个键了,不仅省事,还可以提高打字速度。

程序员长时间使用键盘,每分钟少按几次 Shift,一天下来就可以省掉很多手指动作。长年累月,也是对自己身体的一种保护。

综上所述,文件名全部使用小写字母和连词线(all-lowercase-with-dashes),是一种值得推广的正确做法。

(正文完)


下面是推广时间。

如果大家还有印象,以前我介绍过一家前端开发的在线教育平台"海棠学院"

他们的特色就是保证课程质量,不吹牛,非常低调地将所有精力,都投入课程准备和学员的悉心指导,让学员循序渐进、多敲多练,掌握前端编程,做出好的项目。如果你想投入前端行业,或者了解互联网技术,他们是一个不错的选择。

根据我的提议,创始人张小河收集了前几期学员的反馈。

"身为一个应届生,接触前端完全是因为不喜欢自己的专业,又到了就业的时节,想想自己还是对互联网比较感兴趣,从网上了解了一下互联网各个方面的工作,发现自己对前端比较感兴趣,由此而入了坑......(全文)"

现在,2017年春季班开始招生了。和上次冬季班一样,依然是0成本入学,只需要缴纳 99 元,即可感受一周的课程,享受完全正式的待遇(录播 + 直播 + 教学监管 + 技术辅导)。一周后,如果觉得不满意,99 元可以退款。

不管你最后是否报名,只要参加培训,都可以免费获得一份前端学习资料

春季班定在3月初开课,名额已经不多了。想从事前端开发,却不知道从何学起的朋友,不要错过这个机会,点击这里,了解详情吧。

(完)

留言(69条)

经常看阮老师的文章,受益匪浅。
阮老师格物致知的精神很难得,尤其是在这样一个“错误的不求甚解”的转载时代,不理解意思就传播出去只会增加信息噪声,能持续写出自己心得体会的博客也越来越少。

搭车问一个问题,现在很多应用都有标签功能(tags),例如 Evernote 的标签系统,我经常用。但是随着标签的不断增多,变得越来越难以管理,因此想借阮老师博客的光,咨询下阮老师和众多网友,有关标签的使用经验。

1. 请问标签,应统一用一种语言(全英文或全中文等),还是根据文章的语言决定?我现在是全英文标签,方便管理,但是有时根据中文语境又无法推断当初设定的英文标签。
2. 请问标签,应该大写、小写、还是首字母大写?例如 LINUX / linux / Linux 等。
3. 请问一篇文章的标签,应该越多越细节化,还是应该越独特越命中率高呢?
4. 大家最常用的标签是什么呢?我是 IT / linux / skill / life / education ,感觉越来越和笔记本分类趋同了,一个笔记本分类内大量相同标签。

「我相信倘有请益的时候,先生是一定不吝赐教的。」:-)

非常受教。谢谢博主!

昨晚用heroku的时候还在纠结为什么app name要小写来着:)谢谢老师分享

补充一点:iOS系统上对文件名大小写敏感,Android系统上对文件名大小写不敏感

macOS 只是默认大小写不敏感,可以创建大小写敏感的分区。

为什么要用“连词线/减号”链接,而不是“下划线”?

遇到过开发的程序布置到服务器出错,就是由于大小写引起的。后面就把 mac 的分区配成大小写敏感。

不完全同意
比如易用性 以此类推就不该有驼峰式变量名 都用下划线式替代最好。相比文件名,变量的敲击次数更频繁 java程序员该按shift累死了

这算是广告吗?我完全是因为内容进来的

@张睿:

我现在处理照片是这样做的:建立一个目录,按照 [日期]-[一级地点]-[二级地点] 命名,比如“2017-02-10-杭州-西湖”,这样不仅浏览方便,将来用脚本处理也方便。我觉得 tag,也可以借鉴这样处理。

引用JasonPu的发言:

相比文件名,变量的敲击次数更频繁 java程序员该按shift累死了

我的建议是,文档的文件名必须小写。

代码脚本视情况而定,尽量采用小写。Java 语言没办法,脚本名必须有大写。

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

采用下划线的问题是,如果遇到有连词线的单词,你怎么办?

比如,日汉词典(Sino-Japanese dict)是写成 sino-jp_dict,还是 sino_jp_dict?

我觉得,不如都采用连词线,简化规则,一律写成 sino-jp-dict。

为什么不是 20170210-杭州西湖

下划线也要多按一下shift 看来以后我要改一下。另外,中文我还是喜欢英文标点加空格

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

可能是因为下划线需要按住Shift

但是实际中减号的位置不太容易按准,shift却很容易按准。频繁打减号很让人抓狂。

细节都可以说的这么清楚,好赞!

最近常来阮老师的博客学习,看到了非常多通俗易懂的文章,偶尔也会有醍醐灌顶的感觉,非常棒!
在此想请教一下阮老师撰写技术文章的时候是否有具体的方法或者是思维框架,得以写出通俗易懂的文章,希望得到阮老师的回复!

这么不起眼小问题都能解决的这么认真,我服!!!

引用张睿的发言:
搭车问一个问题,现在很多应用都有标签功能(tags),例如 Evernote 的标签系统,我经常用。但是随着标签的不断增多,变得越来越难以管理,因此想借阮老师博客的光,咨询下阮老师和众多网友,有关标签的使用经验。

3. 请问一篇文章的标签,应该越多越细节化,还是应该越独特越命中率高呢?
-)

刚好用 Evernote,对标签问题也考虑过,最后直接用的自定义标签的方法,具体来说,放弃使用系统标签索引内容,直接在笔记内容里添加自定义标签(文本加特定的符号)来替代,这样自由度高,操作方便,宝贵的系统标签还可以用作其他方面(比如 GTD 中的场景),详细的可以参考这个 Evernote 的信息组织结构 http://cloudlet.info/t/279

阮老师,Mac好像有一种硬盘格式是支持大小写敏感的

引用阮一峰的发言:

采用下划线的问题是,如果遇到有连词线的单词,你怎么办?

比如,日汉词典(Sino-Japanese dict)是写成 sino-jp_dict,还是 sino_jp_dict?

我觉得,不如都采用连词线,简化规则,一律写成 sino-jp-dict。

如果您说遇到有连词线的单词,我则更认为平时应该永下划线_来命名了呢。

因为,如您所说日汉词典(Sino-Japanese dict)要是写成sino-jp-dict,那么会被误解为是三个单词或者一个,但实际上前两个才是一组呢!

就再比如,7岁男孩(seven-year-old boy)那么seven-year-old就是一个形容词,那我们当然应写为 这样虽然看起来稍有不美观,但更清楚易懂了呢。

一点拙见。另,常常读您文章,让我获益很大,感谢!

阮一峰老师,我记得大小写对seo也会有影响的吧,小写文件名更便于搜索

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

“下划线”没有“减号”明显

-_-

引用xbei的发言:

“下划线”没有“减号”明显

-_-

111

大小寫混合的 .h, 到 linux 就有編不過的問題 (c 語言)
而且要按 shift 也很不方便

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

因为下划线要多按一个shift.....^O^

"程序员长时间使用键盘,每分钟少按几次 Shift,一天下来就可以省掉很多手指动作。长年累月,也是对自己身体的一种保护"

一看你就是不运动的人,手指都不想动。

老师来些PYTHON教程可以吗

不完全同意。

一、不同意易读性

驼峰命名法不止关于驼峰,还有规则说两个字符首字母缩写词,则两个字符都大写。更长的首字母缩写词则首字符大写其余小写。在你的例子中应写成NYPoliceSwatLee,非常易读。

IOStream而不是IoStream
CCCsv而不是CCCSV(信用卡的CSV验证数字)

二、不同意易用性

“用户的文件都采用小写文件名,就很方便与上面这些目录或文件相区分”的目的是什么?
这种方法并不能完全区分用户目录与系统目录,除非所有系统目录都首字母大写。

另外用命名区分用户目录与系统目录,不免有匈牙利命名法的滋味,即把可以通过其他手段获得的信息添加到名称中。

如果编写一个系统程序,要生成一些目录,要首字母大写还是全小写?

三、便捷性

在程序文件中,按这个逻辑,变量名类名都得小写,方便不区分大小写的搜索。但现代的编程约定都支持变量名可以有大写字符。我不清楚加-i参数会有多少麻烦,但是如果你真的觉得麻烦,可以定义别名,如findi="find -i"。

你那张按shift键的图正好说明不应该是用你的命名法,因为shift键在智能机上至少在首屏,而连字符还得进入字符界面去按。

同样的,在键盘上,少按shift但是多按-,到底是否起到保护作用还存疑。

引用张睿的发言:


1. 请问标签,应统一用一种语言(全英文或全中文等),还是根据文章的语言决定?我现在是全英文标签,方便管理,但是有时根据中文语境又无法推断当初设定的英文标签。
2. 请问标签,应该大写、小写、还是首字母大写?例如 LINUX / linux / Linux 等。
3. 请问一篇文章的标签,应该越多越细节化,还是应该越独特越命中率高呢?
4. 大家最常用的标签是什么呢?我是 IT / linux / skill / life / education ,感觉越来越和笔记本分类趋同了,一个笔记本分类内大量相同标签。


标签的问题也困扰我挺久的。不要强制使用全英文,除非你英文说得跟母语一样。一个命名规范,在计算机领域内适用,在其他领域的行为可以是未定义的,但不能是有问题的。你的全英文规范,在其他领域就是有问题的。不然你记录一片比如爱情的文章、心理学的文章,不是计算机方面的,你还想个英文的标签?你记录一篇梁静茹的文章,你还去找她的英文名,还是用拼音?

有问题就要做到深层剖析,谢谢阮老师!

之前一直收到这个问题的困扰,此篇文章清晰易懂,简短干练,谢谢阮老师。

于细节处出真知,和学问。

引用JasonPu的发言:

不完全同意
比如易用性 以此类推就不该有驼峰式变量名 都用下划线式替代最好。相比文件名,变量的敲击次数更频繁 java程序员该按shift累死了

然而输下划线也要按shift.

以英语为母语的人,大写比小写易读。

macOS 默认是大小写敏感的吧,我的两台Mac都是。

个人更习惯用下划线,如果用连词线,容易和英文中的连词线混了。

不认同此文观点

当前中文技术文档,不管在哪个公司都会看到很乱的文档,术语不规范,概念不清晰,句子长难等问题大量存在,所以,您的这个中文技术文档编写规范的意义重大。

非常感谢!

我认为没有必要为大小写和系统命名等冲突担忧吧,难道大家的项目工程中的文件命名都不加前缀么?

见仁见智啊,有一定的道理

大神就是不一样,连一个文件名大小写问题都能分析得如此透彻,get。

引用张睿的发言:

经常看阮老师的文章,受益匪浅。
阮老师格物致知的精神很难得,尤其是在这样一个“错误的不求甚解”的转载时代,不理解意思就传播出去只会增加信息噪声,能持续写出自己心得体会的博客也越来越少。

搭车问一个问题,现在很多应用都有标签功能(tags),例如 Evernote 的标签系统,我经常用。但是随着标签的不断增多,变得越来越难以管理,因此想借阮老师博客的光,咨询下阮老师和众多网友,有关标签的使用经验。

1. 请问标签,应统一用一种语言(全英文或全中文等),还是根据文章的语言决定?我现在是全英文标签,方便管理,但是有时根据中文语境又无法推断当初设定的英文标签。
2. 请问标签,应该大写、小写、还是首字母大写?例如 LINUX / linux / Linux 等。
3. 请问一篇文章的标签,应该越多越细节化,还是应该越独特越命中率高呢?
4. 大家最常用的标签是什么呢?我是 IT / linux / skill / life / education ,感觉越来越和笔记本分类趋同了,一个笔记本分类内大量相同标签。

「我相信倘有请益的时候,先生是一定不吝赐教的。」:-)

1.统一首选自己的母语。因为这是自己最熟悉的语言,也是自己的思维所使用的语言,所命名的标签在语义上也就是最能够接近自己内心对文章的定位的词语。
2.如果是英文,建议首选全部小写,理由与阮老师在本文最后所述理由相同,当然,一些专有名词或缩写什么的为了提高区分度建议使用大写
3.标签,顾名思义,应该就是被贴标签之实体最显著的特点,比如我们常说给每人贴标签,同样也适用于文章之类的,应该是文章内容所涉及的主要几个点,或者自己对文章内容中最关心的几个点。
4.标签应该是分类的补充,尽量避免与分类处于同一个维度,每篇文章只能有一个分类,但为了以后检索方便,可以用几个显著的标签用来辅助定位。

个人观点,以上。

引用阮一峰的发言:

采用下划线的问题是,如果遇到有连词线的单词,你怎么办?

比如,日汉词典(Sino-Japanese dict)是写成 sino-jp_dict,还是 sino_jp_dict?

我觉得,不如都采用连词线,简化规则,一律写成 sino-jp-dict。


我觉得都使用下划线比较好,因为双击含有下滑线的单词会能全部选中。中划线却不能选中。

Java 文件名呢呢呢呢呢……

引用丁洁兰的发言:


我觉得都使用下划线比较好,因为双击含有下滑线的单词会能全部选中。中划线却不能选中。

赞同,复制文件名的时候总希望双击全选,用连接线却不能全选中。

阮老师的文章基本都看过了,真的受益匪浅!

唯一不同意的一点,也最不同意的一点是——使用连接线。在linux下,文件名里不同单词之间是下划线,在同一个单词和时间才是连接线。
望能改正这点。

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

这样可以少按shift。

我之前因为担心潜在的兼容性问题,只用数字字母下划线组合来对文件命名,刚才试了一下连接号命名好像也完全没问题,看来以后可以改一下习惯了。
毕竟每天可以少按几百几千下shift还是很不错的。XD

轻率地发了上面的回复才发现大家对下划线进行了很多深入且有益的讨论,可惜没法删了。

个人感觉,默认用下划线,遇到连词再用连接线,这方案可能更好。下划线由于不显眼,通常起替代空格的作用,更容易区分每个词,从而提高可读性。

决定文件名大小写敏感与否的不是操作系统,是文件系统

个人习惯用下划线

那文件夹名呢?是不是也和文件名一样的处理方案?

您好!
我们是一个刚起步的微信公众号(麦思科技Matrix),看到您的文章《为什么文件名要小写?》深感对我司学员很有帮助,请问可否转载?有何转载要求?
望回复,谢谢!

(*@ο@*) 哇~ 阮老师解释的真好!终于可以告诉我们团队的小伙伴们我的文件命名原因了!O(∩_∩)O谢谢

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

因为下划线要按shift键

今天就被mac给坑了一次、mac本地构建的时候没有问题、发到服务器上构建失败、后来才发现有一个require文件大小写有问题。。。

引用丁洁兰的发言:

我觉得都使用下划线比较好,因为双击含有下滑线的单词会能全部选中。中划线却不能选中。

是的,在vim中gd搜索时会遇到这样的情况,中划线不能选中。

感谢阮一峰,真的是无所不在的存在啊
经常出现在Google前三

引用Haiming的发言:

为什么不是 20170210-杭州西湖

很明显啊,可以增加过滤方式,杭州-西湖,就可以分别按照城市和经典分别过滤了

引用csbun的发言:

为什么要用“连词线/减号”链接,而不是“下划线”?

这个问题我也想了很久,找了很多最佳实践,总是说服不了我,直到我看到了这篇文章:
下划线连接的两个单词会认为是一个单词,而用减号,则认为是两个单词
https://medium.com/@maddendan/hyphens-vs-underscores-in-file-names-295025782912

我想用“.”来连接,all.lowercase.with.dots 这样有没有什么问题

前几天看了阮老师的《未来世界的幸存者》,很感兴趣,今天跑来拜读老师之后的文章,本来差点要划过去的文章,但是还是点了进来,结果就看见了前端的启蒙老师的提问,祝老师身体健康,一切都好❤

以下是本人(前端开发者)写作习惯,仅供参考:

.vue PascalCase
.js underscore_case
folder hyphen-case

引用JasonPu的发言:

不完全同意
比如易用性 以此类推就不该有驼峰式变量名 都用下划线式替代最好。相比文件名,变量的敲击次数更频繁 java程序员该按shift累死了

Java 开发一般都用 IDE,只需敲前面几个字母,然后使用快捷键就可以选择。

感谢阮老师解释,这问题纠结我很久,现在理解了一些

下划线可以鼠标点击连选,而“减号”不行,但是后者好看。带“减号”的文件名或路径在博客中称为slug,就比如这篇文章的路径。

zh_CN.UTF-8
尽管这不是文件名,但是集合了小写,大写,下划线,短横

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接