文件名中的换行符

jas*_*yan 26 shell-script filenames newlines

我理解并接受防御性1 shell 脚本既谨慎又从长远来看更可持续的前提。

此处的许多文本处理问题的答案都遵循这一原则,将非正统文件名的意外情况纳入到答案中;可能包含空格、破折号和换行符。

文件名中的新行有多普遍?具体来说:

  • 是否有任何应用程序默认创建包含换行符的文件名?
  • 是否存在需要创建此类文件名的情况?
  • 或者它们主要是用户错误的实例?

[1] 意味着规划和管理尽可能广泛的场景和突发事件......

受(相当悲哀的)对这个问题的评论启发的问题

Gil*_*il' 28

除了为测试操作文件名的应用程序而故意创建的文件名之外,我从未见过带有换行符的文件名。可能会出现包含换行符的文件名,因为:

  • 一些错误或用户错误(例如错误的复制粘贴)导致了意外的文件名。
  • 某些文件系统损坏影响了文件名。
  • 有人故意创建了一个“奇怪”的文件名来利用安全漏洞,应用程序对它传递的文件名的信任度超出了它应有的水平。

POSIX 将文件名定义为“由用于命名文件的 1 到 {NAME_MAX} 个字节组成的名称。组成名称的字符可以从除斜杠字符和空字节之外的所有字符值的集合中选择。文件名 dot 和 dot-dot 具有特殊含义。” 不能保证每个文件系统都接受“奇怪的”文件名(唯一保证的字符是ASCII 字母、数字、句点、连字符和下划线,即A-Z, a-z, 0-9and ._-,连字符禁止在第一位),但现代上的大多数本机文件系统unices 做。

  • @toxalot 不,不保证空格是可移植的,也不保证`,`(由 RCS 使用)、`:`(由 X.org 使用)、`~`(由许多备份文件的程序使用),......但它们是几乎所有现代系统都支持。 (4认同)

sml*_*sml 25

在写论文时,我经常从各种来源收集 PDF 文件的参考书目。并非所有这些都包含正确的元数据,这意味着我有时会将论文的标题从 PDF 查看器复制粘贴到文件名中。这通常会导致文件名中出现换行符,但我使用过的任何工具都不是问题。

恕我直言,对标准进行编码并没有什么“防御性”......该标准规定文件名中允许换行。如果您的脚本不能处理标准中允许的所有文件名,则您的脚本已损坏。

  • +1 表示“如果您的脚本未处理标准中允许的所有文件名,则您的脚本已*损坏*”(已添加强调) (6认同)
  • 这是一个人的[关于为什么我们应该改变文件名中可接受的字符的争论](http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html),我个人同意他的观点。 (4认同)
  • 感谢真实世界的例子;它非常雄辩地强调了你对标准的看法...... (2认同)