Windows下文件命名规范

1. 保留字符

Windows 系统下以下保留字符不能出现在文件名中:

保留字符 说明
< 英文小于号
> 英文大于号
: 英文冒号
" 英文双引号
/ 英文正斜杠
\ 英文反斜杠
| 英文竖线
? 英文问号
* 英文星号
ASCII NUL 数值为零的 ASCII 字符

有关 Windows 系统下文件命名规则详情见命名文件、路径和命名空间

2. Linux 文件名转 Windows

在 Linux 系统命名文件则没有 Windows 系统这么多限制,上述 Windows 的保留字符都可以出现在 Linux 系统中。因此,当跨平台同步文件时,会出现 Windows 系统上的文件同步到 Linux 系统没有问题,但 Linux 上文件名带有上述 Windows 系统的保留字符的文件则无法同步到 Windows 系统上。为了解决这个问题,本人采用的方法是在 Linux 系统中将带有上述 Windows 系统保留字符的文件名进行修改,将其中的保留字符替换成中文环境下的字符(大部分为全角),具体替换映射如下:

保留字符 替换字符
<
>
:
" (左)、(右)
/
\
|
?
*
ASCII NUL 空(即去除)

具体 Python 代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import os
import os.path as osp
import shutil
import argparse


ILLEGAL_SYMBOL = ['<', '>', '/', '\\', '|', ':', '"', '*', '?']
REPLACE_SYMBOL = [['‹'], ['›'], ['/'], ['\'], ['|'], [':'], ['“', '”'], ['*'], ['?']]
SYMBOL_CYCLE = [1, 1, 1, 1, 1, 1, 2, 1, 1]


def main():
parse = argparse.ArgumentParser()
parse.add_argument("-d", "--dir", type=str, help="The path of the directory to be normalized.")
args = parse.parse_args()

assert osp.exists(args.dir)
for root, _, files in os.walk(args.dir):
for file in files:
new_file = file.replace('\x00', '') # remove ASCII NUL
for i in range(len(ILLEGAL_SYMBOL)):
count = 0
while ILLEGAL_SYMBOL[i] in new_file:
new_file = new_file.replace(ILLEGAL_SYMBOL[i], REPLACE_SYMBOL[i][count % SYMBOL_CYCLE[i]], 1)
count += 1

if new_file != file:
shutil.move(osp.join(root, file), osp.join(root, new_file))
# print(root, ": ", file, " -> ", new_file)


if __name__=='__main__':
main()

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!