文件(或目录)名称中分隔符的良好风格/实践

Bor*_*jaX 17 linux bash filenames

我不确定这是否是在这里发布的“正确”问题。我可能更多地询问“意见”而不是实际的分类答案(那些要么有效要么无效,就是这样)。

我想知道什么名称分隔符对linux友好(或者更具体地说,Bash 友好)同时对人类友好

假设我想创建一个目录,其中包含与Mr. Foo Bar相关的内容(Foo是名字,Bar是姓氏)

有名字“ Foo-Bar/”很方便。-是一个“常规”字符,不需要转义,它清楚地表明FooBar是两个独立的东西......很好。

现在,“ Foo.Bar”有点棘手。有人可能认为这Foo.Bar实际上是一个文件(乍一看,特别是如果您没有启用着色的终端),其中“ Foo”是文件名,“ Bar”是扩展名。

我也可以使用“ Foo Bar”,但是当我想访问目录时我需要转义空格,如果我想列出父目录的内容(所在Foo Bar的位置)并将所述列表放入 bash 数组中,则空白会引起麻烦(很多)。不太好。

括号()也会导致很多问题。它们还需要被转义,然后导致命令出现问题scp......不好。

所以......问题(最后)是:如果您需要使文件名一目了然且有意义,并且需要使用分隔符,您使用什么?

Joh*_*han 14

简短回答:“Foo_-_Bar”

长答案:

为了让事情更容易被发现,我倾向于在需要的地方使用一系列字符,这个想法是使用容易发现的东西,这样你就会知道这是分隔符,可能是“__”或“ ___”。

我使用它的一个实际示例是我的 mp3 集合,其中文件名包含艺术家和歌曲标题,有时还包含序列号。如果您使用魔术序列将它们分开,那么对于眼睛和脚本来说都很容易。mp3 示例看起来像这样。

  • 01_Blue_Man_Group_-_Above.mp3
  • 02_Blue_Man_Group_-_Time_to_Start.mp3
  • 03_Blue_Man_Group_-_Sing_Along.mp3

现在,如果 Foo 和 Bar 是两个不应混合的逻辑事物,则可以将其转换为您的示例,那么这可能是 Foo_-_Bar。

  • 通过这种方式,您还可以区分已经包含破折号(或一般情况下的分隔符)的名称。 (2认同)

kil*_*ist 9

有这么多你可能认为不应该是特殊的字符,实际上是特殊的,无论如何我只是使用特殊字符。这也让我养成了使用 bash 补全的好习惯,它会自动转义文件名中的所有特殊字符。但这也让我养成了转义/引用脚本中的所有内容和 bash 中的多部分 1-liners 的好习惯。

例如,在一个简单的 1-liner 中:

for file in *.txt; do something.sh "$file"; done

这样,即使其中一个文件有空格或其他一些字符,do循环部分仍会对其进行操作,并且不会错过 2 个或更多文件名部分,这可能会导致意外的副作用。

由于我无法控制我遇到的每个文件的空格/非空格命名,如果我尝试,它可能会在某处破坏一些符号链接,导致更多意想不到的后果,我只是希望所有文件名/目录名中都可以有空格,只需引用/转义所有变量即可进行补偿。

所以,然后我只在文件名中使用我想要的任何字符(通常是空格)。

我什至在 ZFS 数据集名称中使用空格,我不得不承认这在为我使用的 NAS 编写软件的开发人员中引起了相当多的头痛。

总结:空格不是无效字符,因此没有理由使用它们。


cas*_*cas 6

-出于您上面提到的原因,我使用了破折号。我避免使用下划线,因为它们需要使用 shift 键,所以至少需要两倍的时间来输入(而且,我认为它们很丑)

与其他任何事情相比,我更倾向于为脚本文件名执行此操作 - 我想清楚地确定脚本的用途对我来说更为重要。文档文件只是惰性数据,但如果滥用脚本,则具有潜在危险。


bah*_*mat 5

我使用下划线 ( _)。从视觉上看,它们消失了,并且易于输入且并不特别。

  • 我发现它们比“-”更丑,而且更难打字(必须使用 shift 键) (4认同)