我知道/在Linux中是非法的,下面这些在Windows中是非法的 (我认为)*。" / \ []:;|,
我还遗漏了什么?
然而,我需要一份全面的指南,一份考虑到各种因素的指南 双字节字符。链接到外部资源对我来说很好。
我需要首先在文件系统上创建一个目录,其名称可能是 包含禁用字符,所以我计划将这些字符替换为 下划线。然后,我需要将这个目录及其内容写入一个zip文件 (使用Java),因此关于zip目录名称的任何其他建议 不胜感激。
我知道/在Linux中是非法的,下面这些在Windows中是非法的 (我认为)*。" / \ []:;|,
我还遗漏了什么?
然而,我需要一份全面的指南,一份考虑到各种因素的指南 双字节字符。链接到外部资源对我来说很好。
我需要首先在文件系统上创建一个目录,其名称可能是 包含禁用字符,所以我计划将这些字符替换为 下划线。然后,我需要将这个目录及其内容写入一个zip文件 (使用Java),因此关于zip目录名称的任何其他建议 不胜感激。
当前回答
在Windows 10(2019)中,输入以下字符时会出现错误,导致输入失败:
文件名不能包含以下字符: \ /: * ?< > |
其他回答
在Unix shell中,您几乎可以用单引号引用每个字符。除了单引号本身之外,您不能表示控制字符,因为\没有展开。从带引号的字符串中访问单引号本身是可能的,因为您可以用单引号和双引号连接字符串,如'I' ' ' ' 'm',它可以用于访问名为"I'm"的文件(这里也可以使用双引号)。
因此应该避免所有控制字符,因为它们很难在shell中输入。其余部分仍然很有趣,特别是以破折号开头的文件,因为大多数命令将这些文件视为选项,除非您在前面有两个破折号,或者您使用./指定它们,这也隐藏了开头的-。
如果你想要更好,不要使用shell和典型命令使用的任何字符作为语法元素,有时依赖于位置,例如,你仍然可以使用-,但不能作为第一个字符;与.相同,只有当你想要使用它(“隐藏文件”)时,你才能将它作为第一个字符。如果您是恶意的,您的文件名是VT100转义序列;-),因此ls会使输出乱码。
这对我来说在Python中已经足够好了:
def fix_filename(name, max_length=255):
"""
Replace invalid characters on Linux/Windows/MacOS with underscores.
List from https://stackoverflow.com/a/31976060/819417
Trailing spaces & periods are ignored on Windows.
>>> fix_filename(" COM1 ")
'_ COM1 _'
>>> fix_filename("COM10")
'COM10'
>>> fix_filename("COM1,")
'COM1,'
>>> fix_filename("COM1.txt")
'_.txt'
>>> all('_' == fix_filename(chr(i)) for i in list(range(32)))
True
"""
return re.sub(r'[/\\:|<>"?*\0-\x1f]|^(AUX|COM[1-9]|CON|LPT[1-9]|NUL|PRN)(?![^.])|^\s|[\s.]$', "_", name[:max_length], flags=re.IGNORECASE)
还可以查看这个过时的列表,以获得FAT32中的=等其他遗留内容。
虽然唯一非法的Unix字符可能是/和NULL,但应该考虑到命令行解释。
例如,虽然在Unix中将文件命名为1>&2或2>&1是合法的,但在命令行中使用这样的文件名可能会被误解。
类似地,也可以将文件命名为$PATH,但当试图从命令行访问它时,shell将把$PATH转换为其变量值。
我也有同样的需求,正在寻找推荐信或标准推荐信,偶然发现了这条线索。我目前在文件和目录名中应该避免的字符黑名单是:
$CharactersInvalidForFileName = {
"pound" -> "#",
"left angle bracket" -> "<",
"dollar sign" -> "$",
"plus sign" -> "+",
"percent" -> "%",
"right angle bracket" -> ">",
"exclamation point" -> "!",
"backtick" -> "`",
"ampersand" -> "&",
"asterisk" -> "*",
"single quotes" -> "“",
"pipe" -> "|",
"left bracket" -> "{",
"question mark" -> "?",
"double quotes" -> "”",
"equal sign" -> "=",
"right bracket" -> "}",
"forward slash" -> "/",
"colon" -> ":",
"back slash" -> "\\",
"lank spaces" -> "b",
"at sign" -> "@"
};
要让Windows告诉你答案,最简单的方法是尝试通过资源管理器重命名文件,并输入反斜杠/作为新名称。Windows会弹出一个消息框,告诉你非法字符的列表。
A filename cannot contain any of the following characters:
\ / : * ? " < > |
微软文档-命名文件,路径和命名空间-命名约定