我想知道Unix中文件的命名约定是什么?我对此不确定,但我认为也许应该遵循一项通用的命名约定?
例如,我想将文件命名为:backup
with part 2
和random
我应该这样做吗:
backup_part2_random
要么
backup-part2-random
要么
backup.part2.random
我希望问题清楚。基本上,我想选择一种符合Unix哲学的格式。
我想知道Unix中文件的命名约定是什么?我对此不确定,但我认为也许应该遵循一项通用的命名约定?
例如,我想将文件命名为:backup
with part 2
和random
我应该这样做吗:
backup_part2_random
要么
backup-part2-random
要么
backup.part2.random
我希望问题清楚。基本上,我想选择一种符合Unix哲学的格式。
Answers:
.
用于分隔文件类型扩展名,例如foo.txt
。
-
或_
用于分隔逻辑词,例如my-big-file.txt
或有时my_big_file.txt
。 -
更好,因为您不必按Shift键(至少使用标准的美国英语PC键盘),而其他人则更喜欢,_
因为它看起来更像一个空格。
因此,如果我理解您的示例,backup-part2-random
或者backup_part2_random
将最接近普通的Unix约定。
CamelCase通常不用于Linux / Unix系统。在/bin
和中查看文件名/usr/bin
。CamelCase是例外,而不是Unix和Linux系统上的规则。
(这NetworkManager
是我想到的唯一一个使用CamelCase的示例,它是由Mac开发人员编写的。许多人抱怨名称的这种选择。在Ubuntu上,他们实际上已将该脚本重命名为network-manager
。)
例如,/usr/bin
在我的系统上:
$ ls -d [A-Z]* | wc -w # files starting with a capital
6
$ ls -d *_* | wc -w # files containing an underscore
178
$ ls -d *-* | wc -w # files containing a minus/dash
409
即使这样,也没有一个以大写字母开头的文件使用CamelCase:
$ ls -d [A-Z]*
GET HEAD POST X11 Xvnc Xvnc4
.
字符也可用于旋转的东西,不仅是指定的延伸。例如my.log my.log.1 my.log.2.gz
。
ls
来自的输出/usr/bin
是参考。这是关于约定的问题。)
我对Unix / Linux文件名约定的看法:
Unix / Linux文件系统本身并不支持扩展的概念。文件扩展名的概念,一些公用事业,如支持完全存在cp
,ls
或者您使用的shell。我相信在NTFS上也是如此,但是我可能是错的。
可执行文件(包括shell脚本)通常从不具有任何扩展名。脚本将具有一个哈希行(即#!/bin/bash
),用于标识应由哪个程序对其进行解释。
/etc
结尾中tab
也超重要的,比如fstab
,mtab
,inittab
。.d
在目录名称后附加,尤其是在目录名称中/etc
,但这并不普遍(更新:https : //serverfault.com/questions/240181/what-does-the-suffix-d-mean-in-linux)rc
广泛用于配置脚本或文件(以前缀(例如rc.local
)或后缀(.vimrc
).htm
在Unix / Linux上的HTML文件末尾使用,而应使用.html
。Makefile
在源代码包中。仅对诸如这样的东西执行此操作README
。~
用于标识备份文件或目录,如important_stuff~
或中所示/etc~
。许多炮弹将扩大一个孤独的~
来$HOME
。 lib
。唯一zlib
可能是例外。in.
,例如in.tftpd
。vmlinuz
意思是压缩,但是我从未见过其他任何以此方式命名的文件。.sh
“扩展名”的shell脚本。我个人觉得这有些烦人,但我不得不承认,我可能不知道使用的一些充分理由.sh
。
.sh
的脚本不是(1)不能以交互方式运行,而是只能从其他脚本/程序运行,或者(2)设计用于采购而不是执行。对于前者,它们必须是可执行的。对于后者,我将可执行文件保留为关闭状态,而仅使用shebang行记录有关编写函数的shell的文档。
#!/bin/zsh
在顶部)中,您知道可以安全地获取另一个扩展名为.zsh的文件,并确保该文件包含合法的zsh代码。如果您的可执行脚本完全符合Bourne Shell的要求(即#!/bin/sh
位于顶部),那么您就会知道采购该.zsh文件会出现问题。
在Unix中,文件名只是一个字符串,与DOS不同,文件名由名称和扩展名组成。因此,任何给定的文件名都是完全可以接受的。
但是许多程序仍然使用以点开头的文件后缀来区分不同的文件类型,即Apache Web Server使用后缀在答案标头中设置正确的MIME类型。
两个想法:
在GNU编码标准Naming Variables, Functions, and Files
部分中,您将找到:
请使用下划线将名称中的单词分开,以便Emacs单词命令在其中可用。坚持小写;
尽管IMO说“您应该使用_
Emacs”似乎有些过时,但是在他们的“标准”文档中却是如此。
让我们假设一下,我们都同意linux内核是linux项目的“必经之道”,并且在那里使用的约定可以被认为是“标准”约定。
grep
Linux内核的 -ing 源代码,您将找到以下内容:
有趣的是,git的破折号为85%,下划线为3.8 %,两者均为11.1%。
选择是明确的,争论不休。;)
个人观点:出于美学和转变的关键原因,我使用破折号。如果您在团队中工作,请投票。但是要重申所说的话,请保持一致。
* 或“ be_all and end_all”(如果您愿意)
您不应在文件名中使用的字符:
| ; ,!@#$()<> / \“'`〜{} [] = +&^
您应该使用字符定界符使名称更易于阅读:
_-。:
(尽管在某些情况下,“:”具有特殊含义)
/
路径分隔符和\ 0(ASCII零)字符串终止符。
坚持字母数字文件名。避免使用空格或用下划线(_)代替空格。将文件名中的标点符号限制为句点(。),下划线(_)和连字符(-)。通常,文件名是小写的,但是当文件名中包含多个单词时,我会使用CamelCase。
使用扩展名指示文件类型。程序不需要扩展,因为执行位用于指示程序,并且外壳知道如何运行各种类型的程序。Shell脚本(.sh)和perl脚本(.pl)常见,但不是必需的。Windows可执行文件扩展名.bat,.com,.scr和.exe表示Unix上的Windows可执行文件。
选择一个标准并坚持下去。但是,如果避免它,它不会破坏任何事情。
隐藏(或点)文件的名称以句点开头。这些通常不会显示在目录列表中。使用“ ls -a”将点文件包括在列表中。
一种约定是使用“ _”代替空格作为单词之间的分隔符。可以使用其他字符代替空格,但是“-”和“。”的常规用法稍强一些。在路径名中,因此通常首选“ _”。
空格在路径名中是合法的,但通常避免使用,因为它们需要引用路径名(“ foo bar”)或转义空格(foo \ bar)。正确编写的Shell脚本会引用可能包含空格的变量,特别是路径名,但是通常这样做是疏忽大意的,在命令行中执行一次性输入命令时,这会带来很多额外的输入。
使用“-”分隔数字簇(如时间戳或序列号)是一种在文件系统上下文之外常用的约定。使用“。” 分隔表示文件类型的“文件扩展名”非常普遍,并且一些重要的工具也依赖于此。例如,在Red Hat Enterprise Linux及其衍生版本RPM上的软件包管理系统希望软件包文件以“ .rpm”结尾。传统的tarball是已压缩(“ .gz”)的tar文件(“ .tar”),因此以“ .tar.gz”结尾。
因此,将它们放在一起,通常会得到类似“ home_backup_2017-07-01.tar.gz”的文件名。
文件名中的单词可以使用Unix约定_
或-
根据Unix约定进行分隔。
如果使用-
,则键入起来更容易,使您无需按SHIFT键。但是由于-
占用的空间很小,因此与相比,阅读分词有些困难_
。使用_
分开的话,使它看起来干净多了,因为_
占用了更多的空间。
在shell脚本和其他计算机编程中,_
用于多词变量,例如MY_ENVIRONMENT_FILE
。充分利用文件名_
也可以保持一致:MY_ENVIRONMENT_FILE=~/my_environment_file
。
在Web开发中,-
首选文件命名。原因之一可能是因为Web链接中的下划线会隐藏下划线,并且如果您手动键入Web链接可能会变得困难。
在大多数编辑器和网页中,this_long_word
都可以通过双击完全选择,但不能完全选择this-long-word
。
-
并_
占用完全相同的空间!:)
_
占用相同的空间,也看起来更干净-
。我应该用“明显”一词。关于等宽字体,_
以及-
使用等宽字体时,可以通过以下类比图片来最好地解释这种差异:evsc.net/v8/wp/wp-content/uploads/2010/09/…–