为何Linux允许~作为文件名 如何在终端正确删除名为~的文件
问题一:Linux 为什么允许
~ 作为合法文件名? Linux 原生文件系统对合法文件名的限制非常少,仅禁止两类字符出现在文件名中:
- 路径分隔符
/:避免文件名被识别为多级路径 - 空字符
\0:避免系统读取文件名时出现字符串截断
其余所有可打印、不可打印字符都可以作为文件名的组成部分,仅由特殊符号构成的文件名也被允许。~ 会被识别为家目录是 Shell 层的主动扩展行为,和文件系统的命名规则无关:文件系统仅负责存储文件名的原始字面量,不会对 ~ 做特殊处理;只有用户在 Shell 中执行命令时,Shell 会在把命令传递给内核之前先做预解析,将单独出现的无引号包裹的 ~ 替换为当前用户的家目录路径,才会触发后续的误删问题。
问题二:如何正确删除名为
~ 的文件,避免被识别为家目录路径? 可以通过以下几种方式禁用 Shell 的波浪号扩展,精准匹配到名为 ~ 的文件:
- 方法1:使用相对路径前缀明确指代当前目录下的文件
执行命令:rm ./~
加上./前缀后,Shell 会将整个字符串识别为当前目录下的文件路径,不会触发波浪号扩展规则。 - 方法2:用单引号包裹文件名,强制保留字面含义
执行命令:rm '~'
Shell 对单引号包裹的内容不会做任何特殊字符解析,会直接将~作为普通文件名传递给rm命令。 - 方法3:用反斜杠转义取消
~的特殊属性
执行命令:rm \~
反斜杠转义符会让后续紧跟的特殊字符失去扩展含义,被当做普通文本处理。
建议执行删除操作前,先将 rm 替换为 ls 验证匹配的文件是否正确,比如先执行 ls ./~ 确认输出的就是你要删除的目标文件,再执行删除命令,进一步降低误操作风险。
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

