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()