5

我一直在使用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)。


注意

为了澄清,输出希望是:

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

2 回答 2

17

您可以先尝试一下,看看会执行哪些命令

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

如果这是你所期望的,你可以echo从命令中删除来执行

for f in *; do mv $f `echo $f | sed 's/2010.*.TW.//'` ; done
于 2012-09-26T12:22:40.520 回答
6

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

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

for file in *
do
  tmp="${file##2010*TW.}"   # remove the file prefix
  mv "$file" "${tmp/../_}"  # replace dots with underscore
done
于 2012-09-26T14:50:13.097 回答