如何递归地重命名包含 * 和其他对文件名/文件夹无效的符号的多个文件和文件夹?

如何递归地重命名包含 * 和其他对文件名/文件夹无效的符号的多个文件和文件夹?

由于某种原因,我的 Ubuntu Mate 20.04 允许我包含*和其他显然对文件名或文件夹无效的符号。但现在我需要将大量档案(例如 15,000 个)复制到另一台 PC。我不知道如何为此编写脚本,所以我需要帮助,以便让我重命名文件夹中的所有内容以及该文件夹的名称,例如:

文件夹:

701*math**2nd

100*eng**1st

etc...

档案:

800-task**201.xls

508-ok*10**300.doc

etc...

我只需要删除字符,将 换成*_只是从文件名中删除字符,因为文件管理器不允许我将它们复制到外部硬盘。

**编辑:这有效!https://askubuntu.com/a/1302061/1661703

答案1

您可以rename从包含所有需要重命名的目录和文件的父目录中使用带有递归 shell 通配符的命令,如下所示:

shopt -s globstar
rename -n 'y/\*/_/' **/*
shopt -u globstar

或者 (以避免Argument list is too long错误) 与find来自rename同一父目录,如下所示:

find -exec rename -n 'y/\*/_/' {} \+

该选项-n用于试运行...当对输出满意时将其删除,以进行实际重命名。

额外的raname语法

  • 要更改每个多重序列*(例如*****等等。) 改为单个_,使用:

    rename -n 's/[\*]+/_/g'
    
  • 匹配并替换多个不同的字符(例如*?:), 使用:

    rename -n 's/[\*\?\:]+/_/g'
    
  • 要从名称中删除匹配的字符,请使用空替换字符串,如下所示:

    rename -n 's/[\*\?\:]+//g'
    

通告

  • 请注意,由于目录也被重命名(如果它们的名称包含匹配的字符,例如*?:等等。), 一些已经作为参数传递的文件路径rename可能会在处理过程中发生变化,从而导致错误:

    Can't rename ...: No such file or directory
    

    防止它们被一次性重命名,因此您需要重新运行重命名命令,直到不再出现错误。

  • 还请注意,如果两个或多个相似的文件/目录名称共享相同的路径并匹配不同的匹配字符(例如file**onefile??onefile:one),那么它们都将被重命名为相同的文件名(例如file_one*),导致只有其类型的第一个名称(*file/directory`)被重命名,而其他的将导致错误:

     ... not renamed: ... already exists
    

    因此,在这种情况下,您将需要更改重命名命令中的替换字符,以便重命名那些剩余的文件/目录,例如_像这样:

    rename -n 's/[\*\?\:]+/__/g'
    

相关内容