如何递归地将目录树重命名为有效的 Windows 文件名?

Jaap Joris Vens

我正在尝试将许多包含 MS-DOS 游戏的目录从 Linux 复制到 Windows 计算机。但是,我得到了一个[WinError 267] The directory name is invalid.

以下是其中一些目录的列表:

$ ls -d *:* | sort -R | head
Commander Keen 2: The Earth Explodes/
1942: The Pacific Air War/
Super Solvers: Treasure Galaxy/
Life and Death 2: The Brain/
Deja Vu 2: Lost In Las Vegas/
Hard Drivin' 2: Drive Harder/
RoboMaze 2: The Lobby/
Dune 2: The Building of a Dynasty/
Blake Stone: Planet Strike/
Star Trek: First Contact/

我怀疑:这些目录名称中的 导致此错误,因为它们是 Windows 文件名中的无效字符

但是,由于我不能保证:是唯一使用的无效字符,我正在寻找一种方法来递归地将所有文件和目录重命名为有效的 Windows 文件名,用无效字符替换有效字符。

什么 Linux 命令可以让我这样做?

苦涩的

我推荐rename命令。通过以下方式安装:

sudo apt install rename

rename 使用 Perl 来制作强大的替换命令,但在这种情况下,一个简单的正则表达式替换就可以了——比如:

rename 's/[<>:"\\|\?*]/-/g;' *

以上将用减号替换方括号内的字符。g手段代替所有的人,不只是第一次出现。如果你想要更复杂的东西,你可以用减号替换一些字符,用下划线替换一些字符,例如:rename 's/[<>:]/-/g; s/["\\|\?*]/_/g;' *

以上只会修复当前目录中的文件和目录。要递归修复子目录和文件,请使用find

find -depth -execdir rename 's/[<>:"\\|\?*]/-/g;' '{}' +

在上面的例子中,find将为rename当前目录中或当前目录下的每个项目运行,执行深度优先搜索。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Windows 10中,如何将文件重命名为包含带有变音符的字符的文件名?

将文件名从大写重命名为小写

在Windows 10上批量重命名文件名

在Windows上重命名时选择完整的文件名

如何通过在Windows中的文件名之间添加通用名来重命名多个文件?

如何在Windows cmd中重命名文件名时忽略文件名开头的字符?

Ubuntu会继承Windows文件名(png,exe等)还是拥有自己的文件名?

将文件重命名为带有文件名的列表

如何将文件重命名为文件名中的子字符串?

PHP:以递归方式将目录中的所有文件重命名为小写

如何在Windows 7中将文件重命名为.htaccess?

对于目录,将具有子目录名称+旧文件名的子目录中的文件重命名为新目录

将URL转换为普通的Windows文件名Java

如何使用Java解开Windows文件名?

Windows CMD-如何将所有子文件夹中的所有文件重命名为父文件夹名称

如何重命名文件名以避免在Windows或Mac中发生冲突?

以静默方式将Windows 8中的用户配置文件目录名重命名为正确的用户名?

Windows 10 命令提示符重命名文件覆盖文件名而不是前置

单点在Windows中是有效的文件名吗?

OSX / MacOs 批量将十六进制文件名重命名为十进制文件名

将目录中的所有文件重命名为其文件名的md5哈希(不包含内容)

将隐藏文件重命名为它们的文件名,..(双点)

将文件重命名为文件名的前缀和中间部分

将文件重命名为已存在的文件名

如何使用名称类似于Windows文件路径的文件名来重命名一组文件

如何将文件名中带有“-yyyy mm dd hh mm”的所有文件重命名为日期/时间之前的部分?

使用Java将文件名列表重命名为另一个列表的文件名

将图像重命名为exif时间:创建唯一的文件名

将文件名中的特殊字符重命名为下划线