如何批量替换多个文件的前缀?
我有很多文件,例如
- 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。