需要递归查找所有包含冒号的文件名并用破折号替换冒号吗?

需要递归查找所有包含冒号的文件名并用破折号替换冒号吗?

我有一个目录“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 脚本。其他发行版可能来自。renamerenameutil-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)。另请参阅这个问题

相关内容