Windows及Linux文件名特殊字符

时间:2022-10-30 09:59:10


概述

在做​​Java实现HTML页面截图功能​​时,Linux系统生成的文件通过MobaXterm这么一款SSH工具下载到本地Windows时,总是报错:

Windows及Linux文件名特殊字符


但是这个文件在Linux服务器里面确实是存在的。仔细对比文件名,才发现文件名里面还有一个​​|​​字符,下载到Windows时失败。

失败的原因(直接抛出结论):​​|​​字符在Linux系统下是合法的文件名,但是Windows下则不是,故而下载失败。MobaXterm这个工具并未考虑到这个字符兼容的问题,哈哈哈。

Windows

在使用Windows时,经常遇到如下报错:

Windows及Linux文件名特殊字符


文件是存放数据的最根本单位,每个文件都有唯一一个文件名用于标记文件。

内容

说明

​/​

Linux的路径分隔符,使用后会导致路径错误

​\​

Windows的路径分隔符,使用后会导致路径错误

​:​

一些编译语言,如java会用它作用文件间的分隔符

​?​

在很多控制台命令中,会当成通配符使用

​*​

在很多控制台命令中,会当成通配符使用

​|​

一些语言中被当成分隔符使用,如Markdown的制表符

​"​

大多数语言中会被当成字符串的开始和结束符,必需转义使用

​'​

一些语言,如Python中,会作为字符串开始和结束符使用

​<​

在HTML或XML中标签开始的标记

​>​

在HTML或XML中的标签结束标记

空格在DOS中,会被当成分隔符使用,必需加引号才可正常工作

​$​

在很多环境中会被当成变量开始符号,如Shell

推荐使用的安全非字母和数字符号。

内容

说明

​_​

下划线任何语言中都可以使用的安全字符。

​@​

因邮件地址而出名,可以安全使用(注意不要和自己的邮件地址冲突)

​+​​​和​​-​

这两个符号虽然也做为运算符,但是作为文件名是没有任何问题的。

​.​

安全,虽然在 windows 中作为后缀的分隔附,但是不影响正常使用。

代码处理:

public static String replaceSpecialCharacters(String filename) {
/*
* windows下文件名中不能含有:\ / : * ? " < > | 英文的这些字符 ,这里使用"."、"'"进行替换。
* \/:?| 用.替换
* "<> 用'替换
*/
filename = filename.replaceAll("[/\\\\:*?|]", ".");
filename = filename.replaceAll("[\"<>]", "'");
return filename;
}

Linux

Linux系统下的特殊字符:​​-​​​(文件名第一个字母)、​​#​​​、​​;​​​、​​$​​​、​​!​​​、​​@​​​、​​&​​​、​​(​​​、​​)​​​、​​\​​​、​​<​​​、​​>​​​、(空格)
处理方法:

  1. 最简单直接的办法,用绝对路径,如:​​touch ./tmp/Me like yuh.mp3​
  2. 使用转移符​​\​​​:​​cp a\&b.c de.c​
  3. 通过双引号​​"​​​:​​cp "a&b.c" de.c​
  4. 特殊地,文件名最前面是​​-​​​,通过加两个​​-​​​:​​rm -- -ab.c​

参考

​​Linux-Shell-文件名特殊字符​​