重命名 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-$&/' *
请注意,这些命令没有任何安全措施 - 在使用它们之前先在小样本上进行测试。
我的目录中有超过一千个名称相似的文件,我想重命名。文件是这种格式
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-$&/' *
请注意,这些命令没有任何安全措施 - 在使用它们之前先在小样本上进行测试。