使用通配符'重命名'

时间:2012-09-26 12:06:05

标签: bash unix wildcard rename

我一直在使用rename命令批量重命名文件。到目前为止,我有一些文件:

2010.306.18.08.11.0000.BO.ADM..BHZ.SAC
2010.306.18.08.11.0000.BO.AMM..BHZ.SAC
2010.306.18.08.11.0000.BO.ASI..BHE.SAC
2010.306.18.08.11.0000.BO.ASI..BHZ.SAC

并使用rename 2010.306.18.08.11.0000.BO. "" *rename .. _. *我将它们缩减为:

ADM_.BHZ.SAC
AMM_.BHZ.SAC
ASI_.BHE.SAC
ASI_.BHZ.SAC

这正是我想要的。我想有点笨拙,但它确实有效。现在问题出现在我有以下文件:

2010.306.18.06.12.8195.TW.MASB..BHE.SAC
2010.306.18.06.14.7695.TW.CHGB..BHN.SAC
2010.306.18.06.24.4195.TW.NNSB..BHZ.SAC
2010.306.18.06.25.0695.TW.SSLB..BHZ.SAC

存在于同一文件夹中。我一直试图在rename命令中使用通配符来获得类似的结果,例如。 rename 2010.306.18.*.*.*.*. ""但是这会将2010.306.18.*.*.*.*.的第一个外观添加到所有其他文件的开头 - 显然不是我所追求的内容,因此我得到了:

2010.306.18.06.12.8195.TW.MASB..BHE.SAC
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.14.7695.TW.CHGB..BHN.SAC
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.24.4195.TW.NNSB..BHZ.SAC
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.25.0695.TW.SSLB..BHZ.SAC

我想我在这里并不理解通配符的相当基本原理,有人可以解释为什么这不起作用以及我能做些什么来获得所需的结果(最好使用rename)。


N.B。

澄清一下,输出想成为:

ADM_.BHZ.SAC
AMM_.BHZ.SAC
ASI_.BHE.SAC
ASI_.BHZ.SAC
MASB.BHE.SAC
CHGB.BHN.SAC
NNSB.BHZ.SAC
SSLB.BHZ.SAC

2 个答案:

答案 0 :(得分:16)

for f in *; do mv $f `echo $f | sed 's/2010.*.TW.//'` ; done

首先尝试

for f in *; do echo mv $f `echo $f | sed 's/2010.*.TW.//'` ; done

查看您要执行的命令

答案 1 :(得分:4)

rename不允许使用fromto字符串中的通配符。当你运行rename 2010.306.18.*.*.*.*. "" *时,实际上你的shell首先展开通配符,然后将扩展结果传递给rename,这就是为什么它不起作用。

不使用rename,而是使用循环,如下所示:

for file in *
do
  tmp="${file##2010*TW.}"   # remove the file prefix
  mv "$file" "${tmp/../_}"  # replace dots with underscore
done