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

时间:2016-06-19 08:49:16

标签: bash unix rename

我在目录中有超过一千个类似名称的文件,并希望重命名。文件格式为

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

我想立即对所有这些内容进行重命名,以便在0-之前在50160306之后添加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

{{1}}是所有文件的共同点。

3 个答案:

答案 0 :(得分:0)

假设-50160306在文件名中是唯一的,并且您使用的是理解${parameter/pattern/string}的shell(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

答案 1 :(得分:0)

如果你不使用bash:

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

答案 2 :(得分:0)

有两个rename工具浮动:一个是util-linux包的一部分,另一个是基于Perl的(详见this answer)。要找出您拥有的那个,请查看手册页的末尾(man rename)。

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

rename 50160306 0-50160306 *

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

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

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