我一直在使用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
答案 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
不允许使用from
和to
字符串中的通配符。当你运行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