我在目录中有超过一千个类似名称的文件,并希望重命名。文件格式为
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}}是所有文件的共同点。
答案 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-$&/' *
请注意,这些命令没有安全措施 - 在使用它们之前在小样本上测试它们。