我如何批量重命名文件名,以便它们不包含与其他文件系统冲突的字符,例如,
Screenshot 2015-09-07-25:10:10
请注意,冒号是此文件名中的问题。这些不会被 Windows 或 Mac 消化。
这些文件可以重命名为
Screenshot 2015-09-07-25--10--10
我必须将大量文件从 Ubuntu 移动到另一个操作系统。我使用 Rsync 将它们复制到 NTFS 驱动器,但丢失了一些文件。我还将它们复制到 ext4 驱动器。
以下列表是保留字符:
< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
另一个问题是 Windows 在文件名方面不区分大小写(大多数 OS X 系统也是如此)。
你可以这样做:
这会将所有这些字符替换为
_
. 请注意,您无需替换/
,因为它在两个文件系统中都是文件名的无效字符,但用作 Unix 路径分隔符。扩展到目录及其所有内容:请注意,两者
/
(标记模式的结尾)和\
都被转义了。为了保持唯一性,您可以为其附加一个随机前缀:一个更完整的解决方案至少应该:
也就是说,
foo.mp3
不应该变成foo.mp3.1
,但是foo.1.mp3
,因为 Windows 更依赖于扩展。考虑到这一点,我编写了以下脚本。我试图通过使用前缀路径来实现非破坏性,我可以将重命名的文件复制到该路径中,而不是修改原始文件。
在行动中:
该脚本在我的 Github 存储库中可用。
用其他字符串或字符递归替换文件名中的字符串或字符列表
下面的脚本可用于通过任意替换每个字符串来替换可能出现在文件名中的字符串或字符列表。由于脚本只重命名文件本身(而不是路径),因此不存在弄乱目录的风险。
替换在列表中定义:(
chars
见下文)。可以为每个字符串提供自己的替换,以便在您想要这样做时能够撤销重命名。(假设替换是一个唯一的字符串)。如果您想用下划线替换所有有问题的字符串,只需定义如下列表:骗子
为防止名称重复,脚本首先创建“新”名称。然后它会检查同一目录中是否已存在名称相似的文件。如果是这样,它会创建一个新名称,前面加上
dupe_1
ordupe_2
,直到找到文件的“可用”新名称:变成:
剧本
如何使用
rename_chars.py
.通过以下命令在目录上测试运行它:
笔记
请注意,在该行中:
在 python 中,一个反斜杠需要被另一个反斜杠转义。
我认为上述解决方案可能有效,但您有另一种情况:ext 文件系统允许更长的文件名和文件夹名。您还必须考虑名称的长度,并使用某种算法对它们进行中继,在名称重复的情况下在最后添加数字或其他内容。