批量重命名,更改前缀


53

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

我有很多文件,例如

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

我想将它们全部更改为

  • CLConnectionContext.h
  • CLConnectionContext.m

我该怎么做?

Answers:


38
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。


谢谢,我现在也自己搞定了。标记为答案。Thx
ErikTJ 2012年

很好,谢谢。您能解释一下-b7-做什么吗?这是对字节列表的引用吗?ss64.com/bash/cut.html
震撼

@imjared使用更多详细信息更新了答案。
mrb

56

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

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

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

如果要在Debian系统中使用util-linux-ng中的版本,则可以使用以下名称 rename.ul


7
注意:rename野外存在多种版本。检查您的本地rename文档以了解如何使用您的文档。
jw013

要删除别名,请执行rename TestSR '' *
Bsienn

嗯...- rename "\<pre\>" "" *>Unterminated <> operator at (user-supplied code).
Flash Thunder

32

Shell参数扩展足以进行像这样的简单转换。由于需要生成额外的进程(用于命令替换本身和cut/ sed),因此命令替换效率较低。

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

说明:TestSR*查找文件,CL${f#TestSR}将是新名称。后面的内容#将从文件名(f)中替换。
Joe Eifert

4

这是一种方法:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} ->查找所有扩展名为.h或.m的文件
  • n=CL ->在文件名中添加一个CL前缀
  • sed -e 's/^Test//' ->从文件名中删除测试前缀
  • mv $a $n ->执行重命名


1

好吧,这并不像我那么难。

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;

1
万一对将来有帮助,您不必为两种模式重复执行命令;你可以使用(例如): ,for f in TestSR*.[mh],。for f in TestSR*.{m,h} for f in TestSR*.m TestSR*.h
mrb 2012年

1

如果您需要一些更美味的产品,可以这样做

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.