重命名 Linux/Unix 中的多个文件

Renaming multiple files in Linux/Unix

我的目录中有超过一千个名称相似的文件,我想重命名。文件是这种格式

GW_LGMS01-50160306185154-01375272.CDR
GW_LGMS01-50160306237154-01375272.CDR.00001    
GW_LGMS02-50160306133554-02308872.CDR
GW_LGMS02-50160306137554-02308872.CDR.00014
GW_LGMS03-50160306221836-02217475.CDR.00001
GW_LGMS03-50160306235132-02217475.CDR

我想一次对所有这些进行重命名,以便在所有这些上的 50160306 之前附加一个 0-。即,

GW_LGMS01-0-50160306185154-01375272.CDR
GW_LGMS01-0-50160306237154-01375272.CDR.00001    
GW_LGMS02-0-50160306133554-02308872.CDR
GW_LGMS02-0-50160306137554-02308872.CDR.00014
GW_LGMS03-0-50160306221836-02217475.CDR.00001
GW_LGMS03-0-50160306235132-02217475.CDR

50160306 是所有文件的共同点。

假设 -50160306 在文件名中是唯一的,并且您使用的 shell 可以理解 ${parameter/pattern/string}(Bash、KornShell 等):

for f in *.CDR*; do
  echo mv "$f" "${f/-50160306/-0-50160306}"
done

使用 echo 执行此操作,看看会发生什么,然后在确定 echo 正确后删除它。

如果你怕弄乱,就把新名字的文件放在一个新文件夹里:

mkdir renamed

for f in *.CDR*; do
  cp "$f" renamed/"${f/-50160306/-0-50160306}"
done

如果你不使用bash:

#!/bin/sh
for i in * ; do
    mv "$i" "$(printf '%s' "$i" | sed 's/\(50160306.*\)/0-/')"
done

有两个 rename 工具四处流传:一个是 util-linux 包的一部分,另一个是基于 Perl 的(有关详细信息,请参阅 this answer)。要找出您拥有的是哪一个,请查看手册页末尾 (man rename)。

使用 util-linux 版本,您可以按如下方式重命名文件:

rename 50160306 0-50160306 *

对于基于 Perl 的版本,它将是(未经测试!)

rename 's/50160306/0-$&/' *

请注意,这些命令没有任何安全措施 - 在使用它们之前先在小样本上进行测试。