[不是可以,就是对的]谈Linux文件名

近日阮一峰老师发了一篇《命令行通配符教程》的文章,作为话唠的我,随手留言吐槽类Unix系统文件名对特殊字符毫无节制。

有网友回复,引起我进一步思考:

  • 类Unix系统中为什么能出现哪些特殊字符?
  • 不能出现哪些特殊字符?
  • 特殊字符做为文件名,会引发什么问题?
  • 怎样规范文件名?

为什么文件名中能够允许特殊字符?

在类Unix系统中,文件名由字节组成,而不是字符。所以理论上任何字节值都可以作为文件名。

当然系统规定了有两个例外,即\000 (ASCII: NUL)空值 和\057 (ASCII: slash)斜杠

测试

window 下:

linux 下:

mkdir test && cd test; 
touch \# &&    # 井号文件名 
touch \; &&    # 分号文件名 
touch \\ &&    # 反斜杠文件名 
touch \" &&    # 双引号文件名 
touch $'\n' && # 换行文件名 
touch $'\t' && # 水平制表符文件名 
touch $'\v' && # 垂直制表符文件名 
touch $'\13';  # 回车符文件名

 

上图可见,这些特殊字符(特殊符号或一些格式控制符),大多数是都是无法在window下做为文件名的,在linux下都成功命名了。只是后面几个文本控制符号都以?号显示。

思考

  • 首先,可以不能代表正确,你有hack的能力,不代表你hack别人就是对的。
  • 我们在编写程序时,会有严格的文件命名规范。我们不会故意使用特殊字符从而搬石头砸自己的脚。
  • 根据墨菲定律,会出错的事总会出错,所以类Unix系统应该对命名加以限制。
  • 程序员不要有掌握奇淫巧技的傲慢,而更应该从解决现实问题出发。

参考资料:

  • https://blog.josephscott.org/2007/02/12/things-that-shouldnt-be-in-file-names-for-1000-alex/
  • https://en.wikipedia.org/wiki/Control_character
  • https://www.techforgeek.info/how_to_rm_file_with_special_ch.html
  • https://unix.stackexchange.com/questions/230291/what-characters-are-valid-to-use-in-filenames
  • https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/#id3


关注微信公众号

码中人 微信公众号