Windows下文件命名规范

2022-03-18 17:08:02 浏览数 (1)

1. 保留字符

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

保留字符

说明

<

英文小于号

>

英文大于号

:

英文冒号

"

英文双引号

/

英文正斜杠

英文反斜杠

|

英文竖线

?

英文问号

*

英文星号

ASCII NUL

数值为零的 ASCII 字符

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

2. Linux 文件名转 Windows

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

保留字符

替换字符

<

>

:

"

“(左)、”(右)

/

|

?

*

ASCII NUL

空(即去除)

具体 Python 代码实现如下:

代码语言:javascript复制
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()

0 人点赞