我有一个目录“main”,其中包含许多子目录,其中一些子目录中的文件名包含冒号。我将“main”目录从 Linux 上传到 GitHub 存储库,但当我尝试在 Windows 计算机上从此存储库提取时遇到了问题,因为 Windows 不允许文件名中包含冒号。
如何使用 Linux 终端递归地查找“主”目录中带有冒号的所有文件名,然后用破折号 (-) 字符替换冒号?
答案1
find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +
(如果此命令对您不起作用,请参阅本答案末尾的兼容性说明。)
这是一个基本的安全版本,只打印将要发生的事情。要让它真正发生,请删除-n
选项。
没有它也可以工作,-name "*:*"
但是最好find
只让需要更改的文件名通过,因为这会使整个命令更快。
它的工作原理如下:
find
发现...- ...在
/path/to/directory
目录中... - ...全部文件 (
-type f
)... - ...具有匹配的名称(
-name "*:*"
),... - ...然后执行
rename
(如果需要则执行多次)... :
...用以下模式替换-
...- ...对所有找到的文件,一次查找多个文件(
{} +
)。
- ...在
笔记:
- 该命令不会重命名目录,这是设计使然。
- 重命名可能无法处理文件名中的某些不常见字符(例如换行符)。您肯定没有这样的文件名,因此这是一个相当正式的说明。
兼容性说明
该解决方案使用Debian、Ubuntu 上可用的软件包rename
中的Perl 脚本。其他发行版可能来自。rename
rename
util-linux
本手册建议非 Perl 的解决方案rename
应该是:
find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +
(再次,-n
如果看起来正确,请删除。)不过我还没有测试过。我认为它只会替换文件名中的第一个冒号。一种解决方法是重复该命令(不带-n
,带-v
),直到没有冒号为止。
或者,您可以从以下位置获取 Perl 脚本:本网站(目前File-Rename-0.20.tar.gz
,该脚本名为rename.PL
)。另请参阅这个问题。