由于某种原因,我的 Ubuntu Mate 20.04 允许我包含*
和其他显然对文件名或文件夹无效的符号。但现在我需要将大量档案(例如 15,000 个)复制到另一台 PC。我不知道如何为此编写脚本,所以我需要帮助,以便让我重命名文件夹中的所有内容以及该文件夹的名称,例如:
文件夹:
701*math**2nd
100*eng**1st
etc...
档案:
800-task**201.xls
508-ok*10**300.doc
etc...
我只需要删除字符,将 换成*
或_
只是从文件名中删除字符,因为文件管理器不允许我将它们复制到外部硬盘。
答案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**one
,file??one
和file:one
),那么它们都将被重命名为相同的文件名(例如file_one
*),导致只有其类型的第一个名称(*file/directory`)被重命名,而其他的将导致错误:... not renamed: ... already exists
因此,在这种情况下,您将需要更改重命名命令中的替换字符,以便重命名那些剩余的文件/目录,例如
_
像这样:rename -n 's/[\*\?\:]+/__/g'