批量重命名、更改前缀

批量重命名、更改前缀

如何批量替换多个文件的前缀?

我有很多文件,例如

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

我想将它们全部更改为

  • CLConnectionContext.h
  • CLConnectionContext.m

我该怎么做?

答案1

我想说最简单的方法就是使用rename许多 Linux 发行版上常见的命令。该命令有两个常见版本,因此请检查其手册页以查找您拥有的版本:

## rename from Perl (default in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' TestSR*

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL TestSR*

使用TestSR*shell 通配符只是*有帮助,因为它可能会传递更少的文件名,rename并降低遇到问题的风险参数列表太长错误,而且更重要的是避免-当前工作目录中存在以 开头的文件名时出现的问题。这对于某些perl基于 的变体尤其重要rename,如果不这样做,就会引入命令注入漏洞。

答案2

for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

这使用 bash 命令替换通过 删除输入文件名中的前 6 个字符cut,添加CL到结果前面,并将其存储在 中$newname。然后它将旧名称重命名为新名称。这对每个文件都执行。

cut -c7-指定仅应从输入返回索引 7 之后的字符。7-是从索引 7 开始没有结束的范围;也就是说,直到该行的末尾。

以前,我曾使用过cut -b7-, 但-c应该使用 , 来处理每个字符可能有多个字节的字符编码,例如 UTF-8。

答案3

外壳参数扩展对于这样的简单转换就足够了。命令替换效率较低,因为需要生成额外的进程(用于命令替换本身和cut/ sed)。

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

答案4

您可以尝试:

for i in TestSR*; do mv "$i" "${i/#TestSR/CL}"; done

man bash详细信息请参见(“参数扩展”部分)。

也应该适用于 ksh93(该语法最初来自于此)和 zsh。

相关内容