Unix文件命名约定


61

我想知道Unix中文件的命名约定是什么?我对此不确定,但我认为也许应该遵循一项通用的命名约定?

例如,我想将文件命名为:backupwith part 2random

我应该这样做吗:

backup_part2_random

要么

backup-part2-random

要么

backup.part2.random

我希望问题清楚。基本上,我想选择一种符合Unix哲学的格式。


4
作为对“惯例”的一般性评论……到目前为止,我已经阅读了所有答案,这让我感到惊讶的是,在(我认为)系统中仅使用一种情况几乎是一种强迫症它的优势之一就是能够有效地使用两种情况……是原始设计(区分大小写)还是过度设计)……只是在沉思
Peter.O 2011年

我的意见:没有约定。文件名只是字符串。选择自己喜欢的风格。
glenn jackman 2011年

1
这是因为没有人想记住命令的大写字母,所以它们都使用相同的命令。
LtWorf

Answers:


57

.用于分隔文件类型扩展名,例如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
Depado

因此连字符/减号/短划线比下划线更常见。
雨果

@雨果是的。上图显示负号(409)与下划线(178)。
Mikel

谢谢。您有关于这些约定的参考吗?
无产阶级

3
+1作为参考。(@Proletariat,ls来自的输出/usr/bin 参考。这是关于约定的问题
通配符

35

更重要的是一个特定的约定是一致的。选择一种样式,并坚持下去。


19

我对Unix / Linux文件名约定的看法:

  • Unix / Linux文件系统本身并不支持扩展的概念。文件扩展名的概念,一些公用事业,如支持完全存在cpls或者您使用的shell。我相信在NTFS上也是如此,但是我可能是错的。

  • 可执行文件(包括shell脚本)通常从不具有任何扩展名。脚本将具有一个哈希行(即#!/bin/bash),用于标识应由哪个程序对其进行解释。

  • 任何两个字母长的可执行文件都非常重要。因此,请勿将可执行文件命名为两个字母的文件名。在任何文件/etc结尾中tab也超重要的,比如fstabmtabinittab
  • 有时.d在目录名称后附加,尤其是在目录名称中/etc,但这并不普遍(更新:https : //serverfault.com/questions/240181/what-does-the-suffix-d-mean-in-linux
  • rc广泛用于配置脚本或文件(以前缀(例如rc.local)或后缀(.vimrc
  • Unix / Linux社区从未对扩展名使用三个字符的限制,而在缩短众所周知的扩展名以适应问题时却皱眉。例如,请勿.htm在Unix / Linux上的HTML文件末尾使用,而应使用.html
  • 在一组文件中,文件名有时会大写,或大写,因此它出现在目录列表的开头。经典示例Makefile在源代码包中。仅对诸如这样的东西执行此操作README
  • ~用于标识备份文件或目录,如important_stuff~或中所示/etc~。许多炮弹将扩大一个孤独的~$HOME
  • 库文件几乎总是以开头lib。唯一zlib可能是例外。
  • 被inetd调用的脚本有时带有前缀in.,例如in.tftpd
  • 以z结尾的vmlinuz意思是压缩,但是我从未见过其他任何以此方式命名的文件。

2
我经常看到带有.sh“扩展名”的shell脚本。我个人觉得这有些烦人,但我不得不承认,我可能不知道使用的一些充分理由.sh
Dan Molding

4
我想到一件事,即强调它是基于文本的脚本而不是二进制文件是很有用的。
LawrenceC

1
@DanMoulding个人而言,我使用.sh的脚本不是(1)不能以交互方式运行,而是只能从其他脚本/程序运行,或者(2)设计用于采购而不是执行。对于前者,它们必须是可执行的。对于后者,我将可执行文件保留为关闭状态,而仅使用shebang行记录有关编写函数的shell的文档。
通配符

3
自6年前以来,我一直使用@Wildcard养成同样的习惯。实际上,该扩展对于获取脚本位非常有意义。例如,从为zsh编写的可执行脚本(即#!/bin/zsh在顶部)中,您知道可以安全地获取另一个扩展名为.zsh的文件,并确保该文件包含合法的zsh代码。如果您的可执行脚本完全符合Bourne Shell的要求(即#!/bin/sh位于顶部),那么您就会知道采购该.zsh文件会出现问题。

4
我发现使用“ .sh”,“。py”,“。pl”等很方便,并且某些文本编辑器(例如Geany)使用这些编辑器来对适当的语法突出显示方案进行首次猜测。
bgvaughan

7

在Unix中,文件名只是一个字符串,与DOS不同,文件名由名称和扩展名组成。因此,任何给定的文件名都是完全可以接受的。

但是许多程序仍然使用以点开头的文件后缀来区分不同的文件类型,即Apache Web Server使用后缀在答案标头中设置正确的MIME类型。


5
尽管gelraen是100%正确的:Unix / Linux本身并不关心文件扩展名,但Linux的现代风格确实很在乎,因为某些shell扩展提供了某些文件类型的特殊标识(颜色或其他方式),文件管理器提供了自动关联与程序。但是,对于人类用户来说,重要的是要知道哪个文件是什么类型。为此,不但要坚持自己和他人的标准方案,这很方便。在这方面,事物与MS Windows(或MIME)不应有太大差异。
asoundmove 2011年

也就是说,有时几种不同的扩展样式可以匹配相同的目的。因此,.tar.gz等同于.tgz,.tar.bz2 = .tbz,.ps.gz通常缩短为.ps(令人困惑),我敢肯定还有更多。
asoundmove 2011年

@asoundmove .ps.gz表示它是压缩的.ps文件。就像.tar.gz意味着压缩的.tar文件一样。
jonescb 2011年

1
@jonescb,当然可以。我对此感到困惑的观点是,当我看到.ps时,我期望一个未压缩的文件(应该可以容纳或更少),但通常.ps文件是经过压缩的,实际上为了清晰起见,应为.ps.gz(因为它们需要zcat或zless才能查看源代码)。有些人还是决定只使用.ps作为压缩后的PostScript文件的后缀,因为某些普通的ps查看器实际上并不介意它们是否经过压缩。
asoundmove 2011年

6

两个想法:

  1. GNU编码标准Naming Variables, Functions, and Files部分中,您将找到:

    请使用下划线将名称中的单词分开,以便Emacs单词命令在其中可用。坚持小写;

    尽管IMO说“您应该使用_Emacs”似乎有些过时,但是在他们的“标准”文档中却是如此。

  2. 让我们假设一下,我们都同意linux内核是linux项目的“必经之道”,并且在那里使用的约定可以被认为是“标准”约定。

    grepLinux内核的 -ing 源代码,您将找到以下内容:

    • 44.6%的时间仅使用破折号
    • 54.1%的时间仅强调
    • 文件同时使用两者的时间为1.2%

有趣的是,git的破折号为85%,下划线为3.8 ,两者均为11.1%

选择是明确的,争论不休。;)

个人观点:出于美学和转变的关键原因,我使用破折号。如果您在团队中工作,请投票。但是要重申所说的话,请保持一致

* 或“ be_all and end_all”(如果您愿意)


4

您不应在文件名中使用的字符:

| ; ,!@#$()<> / \“'`〜{} [] = +&^

您应该使用字符定界符使名称更易于阅读:

_-。:

(尽管在某些情况下,“:”具有特殊含义)


5
当然,您甚至不能在文件名中使用“ /”。其他一切皆有可能。如果你想使其难以进入,即使是有用的;-)
于尔根A.艾哈德

该列表实际上要长得多,包括控制和非ASCII字符。是的,您可以在* nix文件名中包含一个退格键。
l0b0 2011年

1
更重要的是,大多数* nix系统仅在文件名中不允许使用两个特定的字符:/路径分隔符和\ 0(ASCII零)字符串终止符。
CVn

4

要补充别人的意见,我只是说带重音符号的字母和许多特殊字符在文件名中是合法的,但它们可能在以下情况下引起问题:

  • 您与其他计算机(尤其是与其他操作系统)共享文件系统;
  • 您可以与其他人共享文件(尽管电子邮件通常可以很好地进行转换,但有时却行不通);
  • 您可以使用Shell脚本来自动执行某些任务(空间有很多问题,尽管有很多方法可以处理它们)。
  • 您使用另一台计算机上的文件共享。

...


3

坚持字母数字文件名。避免使用空格或用下划线(_)代替空格。将文件名中的标点符号限制为句点(。),下划线(_)和连字符(-)。通常,文件名是小写的,但是当文件名中包含多个单词时,我会使用CamelCase。

使用扩展名指示文件类型。程序不需要扩展,因为执行位用于指示程序,并且外壳知道如何运行各种类型的程序。Shell脚本(.sh)和perl脚本(.pl)常见,但不是必需的。Windows可执行文件扩展名.bat,.com,.scr和.exe表示Unix上的Windows可执行文件。

选择一个标准并坚持下去。但是,如果避免它,它不会破坏任何事情。

隐藏(或点)文件的名称以句点开头。这些通常不会显示在目录列表中。使用“ ls -a”将点文件包括在列表中。


5
CamelCase是Unix上的反模式。OP正在询问约定。
Mikel

2
这不是“坏”还是“好”。这是“通常的做法”。这是OP所要求的惯例。原因?可能是因为Unix人们不喜欢按Shift,这可能是因为旧系统仅具有大写字母,或者是其他原因。我不确定。
Mikel

@Mikel我也在CamelCase是约定的地方编写Java。有时,模式和约定会冲突。
BillThor 2011年

.scr也是Windows可执行文件的扩展名。
LawrenceC

1
@ultrasawblade谢谢,显示了我编写Windows脚本的频率。我试图跳过稀有的可执行扩展,例如cmd,pif,vb *,wsh等。
BillThor 2011年

2

一种约定是使用“ _”代替空格作为单词之间的分隔符。可以使用其他字符代替空格,但是“-”和“。”的常规用法稍强一些。在路径名中,因此通常首选“ _”。

空格在路径名中是合法的,但通常避免使用,因为它们需要引用路径名(“ foo bar”)或转义空格(foo \ bar)。正确编写的Shell脚本会引用可能包含空格的变量,特别是路径名,但是通常这样做是疏忽大意的,在命令行中执行一次性输入命令时,这会带来很多额外的输入。

使用“-”分隔数字簇(如时间戳或序列号)是一种在文件系统上下文之外常用的约定。使用“。” 分隔表示文件类型的“文件扩展名”非常普遍,并且一些重要的工具也依赖于此。例如,在Red Hat Enterprise Linux及其衍生版本RPM上的软件包管理系统希望软件包文件以“ .rpm”结尾。传统的tarball是已压缩(“ .gz”)的tar文件(“ .tar”),因此以“ .tar.gz”结尾。

因此,将它们放在一起,通常会得到类似“ home_backup_2017-07-01.tar.gz”的文件名。


2

使用-_命名扩展
_功能的文件
.

cat << EOF > foo-bar.sh  
foo_bar() {  
echo baz  
}  
EOF  

0

我同意大卫·奥尼尔(David Oneill)的观点,即您应该随身携带一些东西。

但是,如果文件可以在同一目录中排序,那就很好了,因此不要编号0 ..10而是编号00 ..10。

在名称中使用日期时,请使用标准日期格式,例如ISO8601

并且不要害怕使用多个字符来分隔名称中的逻辑部分。如果使用_(原为3 _),则以后可以简化文件名上的正则表达式。

因此,您的示例可能是这样的:

backup_2011-06-19T114012___part002___random

易于阅读且易于使用脚本解析。


0

文件名中的单词可以使用Unix约定_-根据Unix约定进行分隔。

如果使用-,则键入起来更容易,使您无需按SHIFT键。但是由于-占用的空间很小,因此与相比,阅读分词有些困难_。使用_分开的话,使它看起来干净多了,因为_占用了更多的空间。

在shell脚本和其他计算机编程中,_用于多词变量,例如MY_ENVIRONMENT_FILE。充分利用文件名_也可以保持一致:MY_ENVIRONMENT_FILE=~/my_environment_file

在Web开发中,-首选文件命名。原因之一可能是因为Web链接中的下划线会隐藏下划线,并且如果您手动键入Web链接可能会变得困难。

在大多数编辑器和网页中,this_long_word都可以通过双击完全选择,但不能完全选择this-long-word


嗯,为什么要读取可变宽度字体的文件名?打开您的终端,-_占用完全相同的空间!:)
通配符

哈哈,你是对的。我使用SourceCodePro + Powerline + Awesome Regular修补字体。即使使用等宽字体,即使与_占用相同的空间,也看起来更干净-。我应该用“明显”一词。关于等宽字体,_以及-使用等宽字体时,可以通过以下类比图片来最好地解释这种差异:evsc.net/v8/wp/wp-content/uploads/2010/09/…–
GMaster

-1

肯定有Linux的标准。如果在任何Linux系统中查看文件名,它们都是带小写的破折号:/ usr / bin / ssh-keygen。这是我现在找不到的Linux Standards Base文档之一中指定的。GNU也指定了此名称,该名称表示要在变量名下使用下划线,在文件名中使用破折号。


-2

除了其他人说的话:

1-即使Linux不太关心扩展名,Windows也是如此,因此请确保计划给任何人的任何文件都具有适当的扩展名。

2-Camel caps似乎是最容易使用的脚本,没有特殊字符担心转义序列。


5
-1。CamelCase不在Linux上使用。
Mikel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.