在 WSL 上使用“mv”重命名文件时出现错误:“是同一个文件”?

在 WSL 上使用“mv”重命名文件时出现错误:“是同一个文件”?

我使用的工作系统(Windows-10)已激活 WSL 并安装了 Debian。我不知道 IT 大神们是否进行了更新,但今天mv使用重命名文件不起作用:

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\pear> bash
[...]
[tart@PEAR plugins]$ mv handle_DailyAccountingSummary.py handle_dailyaccountingsummary.py
mv: 'handle_DailyAccountingSummary.py' and 'handle_dailyaccountingsummary.py' are the same file

[tart@PEAR plugins]$ ll
total 36K
drwxrwxrwx 1 tart tart 4.0K Sep 19 17:17 .
drwxrwxrwx 1 tart tart 4.0K Sep 19 17:17 ..
-rwxrwxrwx 1 tart tart 5.3K Sep 19 17:17 handle_DailyAccountingSummary.py

为什么会发生这种情况? (我甚至尝试过。我确实用、和--force重命名了我的文件,但是 WTF?)mv Name.py name-bak.pymv name-bak.py name.py

更新2020-10-09:

我安装了新的Windows 终端,并使用我的 WSL Debian 终端配置设置作为“”source“:”Windows.Terminal.Wsl“。

清理目录我测试了移动(重命名)功能(因为我仍然很惊讶我之前没有注意到它),然后它竟然有效了:

[tart@RCB-PEAR Testing.d]$ dir
DailyAccountingSummary_09_25_2020.xlsx
[tart@RCB-PEAR Testing.d]$ mv DailyAccountingSummary_09_25_2020.xlsx DailyAccountingsummary_09_25_2020.xlsx
[tart@RCB-PEAR Testing.d]$ ls
DailyAccountingsummary_09_25_2020.xlsx

这真令人沮丧。我立即按照上述方法测试了 PowerShell/WSL,并重现了上述错误。

哦,那么 Windows 终端没有这个问题吗?不。回到 Windows 终端来撤消重命名,现在 Windows 终端抛出了同样的错误:

[tart@RCB-PEAR Testing.d]$ ls
DailyAccountingsummary_09_25_2020.xlsx
[tart@RCB-PEAR Testing.d]$ mv DailyAccountingsummary_09_25_2020.xlsx DailyAccountingSummary_09_25_2020.xlsx
mv: 'DailyAccountingsummary_09_25_2020.xlsx' and 'DailyAccountingSummary_09_25_2020.xlsx' are the same file

打开 PowerShell 和 Windows Terminal 的结果是什么?

  • 关闭应用程序级别的所有终端
  • 重启

都没有恢复到之前的状态。没有线索,但是不一致。

答案1

这里的问题是,您正在使用不区分大小写的文件系统。默认情况下,Linux 区分大小写,文件名仅被视为一系列字节。

此消息旨在捕获两个文件为硬链接的情况。在 Linux 系统上,硬链接只是磁盘上相同 inode 和块集的替代名称,它们完全无法区分。两者之间没有哪个名称比另一个名称更有特权或更规范。

当您尝试执行rename(2)系统调用并且两个文件是指向同一文件的硬链接时,什么也不会发生,成功。但是,这种行为令人困惑:您仍然拥有这两个名称,并且也许您预计旧名称现在不存在,因此某些操作会失败。 mv在这种情况下会失败,因为默默地什么都不做几乎从来都不是理想的行为。

但是,就您而言,您实际上是在不区分大小写的文件系统上工作,这很难与具有许多仅大小写不同的硬链接的文件区分开来。(如果列出目录内容,则可以区分,但这不是特别有效。)这可能没有经过严格测试,因为它实际上从未出现在真正的 Linux 系统上。

尽管 Linux 上可以使用不区分大小写的文件系统,但无法以不区分语言环境的方式正确执行大小写折叠因此可能没有太多兴趣修复这些问题,因为这些文件系统肯定会被破坏超过 7500 万人

在这种情况下,您可以向发行版提交错误报告,并要求他们更优雅地处理这种情况。在这种情况下,这样做会涉及更多系统调用(枚举目录),并且 2018 年有一系列补丁来删除系统调用,因此人们可能不感兴趣。不过,不问就永远不知道。

相关内容