【问题标题】:Are there any invalid linux filenames?是否有任何无效的 linux 文件名?
【发布时间】:2010-11-21 14:44:57
【问题描述】:

如果我想创建一个保证不代表文件名的字符串,我可以在 Windows 上将以下字符之一放入其中:

\ / : * ? | < >

例如

this-is-a-filename.png

?this-is-not.png

有没有办法在 Linux 上将字符串识别为“不可能是文件”?

【问题讨论】:

  • 相当肯定 '/' 至少是不允许的(或者如果不是,它将是一个完整的 PITA)
  • char *str="foo/bar";虽然很可能代表一个文件

标签: windows linux file filesystems filenames


【解决方案1】:

几乎没有任何限制——除了'/''\0',你可以使用任何东西。但是,some people 认为允许这么大的灵活性并不是一个好主意。

【讨论】:

  • + 它可能取决于正在使用的文件系统。
  • 我实际上认为至少某些文件系统可能支持NUL
  • 轶事 - 我已经处理了包括\0在内的文件名的噩梦,它使xargs -0 barf
  • 那么... 是合法的文件名吗?
  • 您能否参考一些自动参考来确认/\0 是唯一一个被禁止的字符?
【解决方案2】:

空字符串是 Linux 上唯一真正无效的路径名,如果您只需要一个无效的名称,它可能对您有用。您也可以使用像“///foo”这样的字符串,它不是规范 路径名,尽管它可以引用文件(“/foo”)。另一种可能性是类似于“/dev/null/foo”,因为/dev/null 具有 POSIX 定义的非目录含义。如果您只需要无法引用常规文件的字符串,则可以使用“/”或“.”,因为它们始终是目录。

【讨论】:

  • ➕1 很聪明,把/dev/null/当成一个目录!
【解决方案3】:

我个人发现很多时候问题不在于 Linux,而在于 Linux 上使用的应用程序。

以 Amarok 为例。最近我注意到我从我的 Windows 机器上复制的某些艺术家没有出现在库中。我检查并确认文件在那里,然后我注意到文件夹名称中的某些字符(以艺术家命名)用一个看起来很奇怪的正方形而不是实际字符表示。

在 shell 终端中,文件名看起来更奇怪:/Music/Albums/Einst$'\374'rzende\ Neubauten 就是一个多么奇怪的例子。

虽然这些文件肯定在那里,但 Amarok 出于某种原因看不到它们。我能够使用一些 shell 技巧将它们重命名为健全的版本,然后我可以使用 Musicbrainz Picard 用纯 ASCII 字符重新命名。不幸的是,在我重命名文件之前,Picard 也无法打开这些文件,因此需要一个 shell 脚本。

总体而言,这是一个棘手的领域,如果您尝试在 Windows 和 Linux 之间同步音乐收藏,其中某些文件夹或文件名包含时髦字符,这似乎会变得非常棘手。

最安全的做法是坚持仅使用 ASCII 文件名。

【讨论】:

  • 这并没有解决我担心的问题。
  • 我不同意。从技术上讲,NTFS 文件系统支持使用它的主要“应用程序”(Windows)认为无效或不使用的各种很酷的功能。
  • 听起来您的 Windows 机器使用的编码与您的 linux 语言环境不同。只要您的文件名使用与您的语言环境相同的编码进行编码,就可以使用宽字符,尽管您是对的,使用 ascii 更安全。
  • ascii 对于非英语语言来说真的很差
【解决方案4】:

从技术上讲,这不是无效的,但是名称开头带有破折号(-)的文件会给您带来很多麻烦。这是因为它与命令参数有冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2020-08-20
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多