我在 Unix 和 Windows 文件系统中查找不允许在文件和目录名称中使用的字符,我想知道是否存在这样的字符。我注意到 * 和 % 是允许的?
答案1
不存在所谓的“Unix”文件系统。也不存在所谓的“Windows”文件系统。您指的是 NTFS、FAT16、FAT32、ext2、ext3、ext4 等吗?每个文件系统对名称中的有效字符都有各自的限制。
另外,你的问题标题和问题指的是两个完全不同的概念?你想知道合法字符的子集,还是想知道两个系统都可以使用哪些通配符?
http://en.wikipedia.org/wiki/Ext3指出文件名中允许使用“除 NULL 和‘/’之外的所有字节”。
http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx描述有效文件名的一般情况“无论文件系统如何”。具体来说,以下字符是保留字符 < > : " / \ | ? *
Windows 还对不使用文件的设备名称进行了限制:CON、PRN、AUX、NUL、COM1、COM2、COM3 等。
Windows 和 Unix 操作系统中的大多数命令都接受 * 作为通配符。Windows 接受 % 作为单字符通配符,而 Unix 系统的 shell 使用 ? 作为单字符通配符。
答案2
最多文件系统相当宽容:例如,所有 NTFS、extN、btrfs、XFS 和 ReiserFS 都允许除 1) 空字节和 2) 斜线之外的所有内容/
。
这操作系统可能有其自身的限制。特别是 Win32 0 API不允许 * ?
作为通配符、\ /
路径分隔符、:
流分隔符,以及< > | "
毫无理由地使用1。同样不允许使用 ASCII 控制字符(0x00-0x1F 范围)。
在 Unix 中,通配符扩展由 shell 和函数完成glob()
。在 Windows 中,这是文件系统驱动程序的工作,这就是为什么*
和?
不能用于文件名的原因。
0我没有关于 Windows 提供的 POSIX 和 OS/2 API 的信息。
1他们是在命令行 shell ( cmd.exe
) 中很特殊,但它肯定可以(并且事实上确实)像 Unix shell 那样处理转义。
答案3
这实际上取决于文件系统,但大多数 Unix 文件系统允许除 NULL 和 / 之外的任何字节。NTFS 允许除 NULL 和 \ / 之外的所有字节:* ? " < > |。
维基百科上有一个非常有用的比较图表:http://en.wikipedia.org/wiki/Comparison_of_file_systems
话虽如此,几乎所有 shell 都会首先将 * 识别为通配符,然后仅在转义后才将其识别为文件名中的字符。为什么不使用 *?
答案4
*
应该在两者中都用作通配符,但扩展这些内容的是 shell 或调用的命令,而不是文件系统本身。例如,Bash 将扩展*
为当前文件夹中以空格分隔的文件列表。
我认为这两种文件系统都没有明确禁止任何字符。在 ext2 或 NTFS 上创建文件名时,使用类似 的名称是完全可能的*&(
。Windows GUI 可能不允许,但您可以在 Cygwin 中执行此操作,因为底层文件系统允许这样做。