Python Windows不能使用无效字符统计文件

我试图做一个快速的Python脚本重命名一堆文件。 这些文件是在这个NTFS驱动器上的Linux系统中创build的,但是我现在在Windows上。 命名约定如下所示:

Screenshot at 2016-12-11 21:12:56.png 

在Windows文件名中:字符是非法的,所以这个脚本的行为对我来说有点奇怪。

 for i in os.listdir("."): print(i) x = i.replace(":", "-") comm = """mv "{}" "{}" """.format(i, x) os.system(comm) 

在上面的代码中, print(i)愉快地打印文件名。 但是,当我尝试运行os.system(comm)重命名我的文件,我得到这个错误:

 mv: cannot stat 'Screenshot at 2016-12-24 14:54:57.png': No such file or directory 

首先,我觉得在Windows下的Python可以告诉这些调皮的文件存在,但是不能实际移动它们有点奇怪。 其次,解决这个问题的最好方法是什么?

我也尝试shutil.move()os.rename()没有运气。 这个 SO问题似乎在讨论这个问题,但似乎更关心预防而不是修复它。 我显然可以切换回Linux并修复它,但我想知道如果我不能在Windows上修复它。

你可以找到他们,因为他们在目录中。 您无法访问它们,因为冒号符号在路径中的分析方式不同。 这意味着文件不能通过包括MoveFile在内的常用路径函数来访问。 你基本上有两个选择:找到一个不依赖于名字的方法,比如OpenFileById ,或者找到文件的替代名字,比如dir /x 。 后者给你的短名称(8.3),不应该包含任何冒号。 我不知道是否有准备好的函数来从Python访问这些名称,所以最短的清除(对我)解决方法是执行dir /x并解析其输出。

我认为与目录描述符相关的路径与Python的标准库到达第一个方法的距离相近,但我不知道这是否足够。 底层的FindFirstFile / FindNextFile函数在WIN32_FIND_DATA (cFileName和cAlternateFileName)中产生两个名字,但是Python期望第一个有效。 这两种方法在PowerShell中都是有意义的,但是它看起来像是完全不知道短名称,并且也是按名称跟踪文件,而不是ID。 否则FileInfo.MoveTo会完成这个技巧。

为了防止这种情况, ntfs-3g支持windows_names选项。 这会导致它在尝试创建文件时出现问题。

结论:正如https://superuser.com/questions/31587/how-to-force-windows-to-rename-a-file-with-a-special-character中所讨论的,没有明确的解决方案。 我所有的尝试方法(和其他一些方法)已经在那里讨论过了。 可能最麻烦的选择是再次在Linux中装载磁盘并从那里重命名; 该文件系统在技术上是腐败的,因为字符是无效的,但微软的修复解决方案是删除,而不是重命名。

Cygwin只是通过使用私有Unicode字符(':'+ 0xf000)来模拟冒号。