使用通配符'重命名'

hed*_*ds1 5 unix bash rename wildcard

我一直在使用该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
Run Code Online (Sandbox Code Playgroud)

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

ADM_.BHZ.SAC
AMM_.BHZ.SAC
ASI_.BHE.SAC
ASI_.BHZ.SAC
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

它存在于同一个文件夹中.我一直试图在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
Run Code Online (Sandbox Code Playgroud)

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


NB

为了澄清,输出想要:

ADM_.BHZ.SAC
AMM_.BHZ.SAC
ASI_.BHE.SAC
ASI_.BHZ.SAC
MASB.BHE.SAC
CHGB.BHN.SAC
NNSB.BHZ.SAC
SSLB.BHZ.SAC
Run Code Online (Sandbox Code Playgroud)

xoi*_*oid 16

for f in *; do mv $f `echo $f | sed 's/2010.*.TW.//'` ; done
Run Code Online (Sandbox Code Playgroud)

第一次尝试

for f in *; do echo mv $f `echo $f | sed 's/2010.*.TW.//'` ; done
Run Code Online (Sandbox Code Playgroud)

看看你要执行什么命令


dog*_*ane 5

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

代替使用rename,使用如下循环:

for file in *
do
  tmp="${file##2010*TW.}"   # remove the file prefix
  mv "$file" "${tmp/../_}"  # replace dots with underscore
done
Run Code Online (Sandbox Code Playgroud)