我无法将文件重命名为单一格式,因为文件名是唯一的

时间:2017-08-01 02:31:07

标签: python regex shell file-rename

我在下面以一种格式重命名了一组文件,如下所示;

ABCD.R9999.COMMON.D170401.T199665.txt

此处,ABCD对于所有文件的开头都是必需的。任何内容都需要RR5526AB8673替换为R9999

然后裁剪所有其他不需要的字段,并使用上述格式重命名该文件。

DH_062_FAT_HSC_H1666_EFTO.FH1666.COMMON.D170801.T0433417
DH_062_FAT_MMA_H0927_EFTO.FH0927.COMMON.D170801.T0433417
ABCD.FH2237.COMMON.D170701.T1549353
P.FH5526.COMMON.D130501.T1243225
FS3389.COMMON.D160901.T1539489
P.FH5587.COMMON.D150601.T1529158.7073202
EFTO.FH3890.COMMON.D170401.T1332005
H1737.COMMON.R201602.D160201.T1725587.txt                 
EFTO.RH3864.MSPCOBMA.D170421.T1246176
P.FH2225.COMMON.D170101.T1737084.12016373.txt
P.FH3204.COMMON.D170701.T1549353.txt_20170627_133012.txt
P.RH2312.COMMON.D110301.T1539063.13313178.txt.gz

我尝试过以下脚本来裁剪文件名;

#!/bin/bash

FILES=/path/to/*COMMON*
for i in $FILES
do
  newarg="$(echo "$i" | sed 's/.FH\d{4}.COMMON.D\d{6}')"
  if [ "$newarg" != "" ];then
    mv "$i" "$newarg" 
  fi
done

1 个答案:

答案 0 :(得分:2)

这里有一些代码可以完成我认为您想要做的事情,尽管您的描述仍然不完全清楚。

import re

data = '''\
DH_062_FAT_HSC_H1666_EFTO.FH1666.COMMON.D170801.T0433417
DH_062_FAT_MMA_H0927_EFTO.FH0927.COMMON.D170801.T0433417
ABCD.FH2237.COMMON.D170701.T1549353
P.FH5526.COMMON.D130501.T1243225
FS3389.COMMON.D160901.T1539489
P.FH5587.COMMON.D150601.T1529158.7073202
EFTO.FH3890.COMMON.D170401.T1332005
H1737.COMMON.R201602.D160201.T1725587.txt
EFTO.RH3864.MSPCOBMA.D170421.T1246176
P.FH2225.COMMON.D170101.T1737084.12016373.txt
P.FH3204.COMMON.D170701.T1549353.txt_20170627_133012.txt
P.RH2312.COMMON.D110301.T1539063.13313178.txt.gz
'''.splitlines()

pat = re.compile(r'(?:.*)(\.COMMON\..*$)')

for s in data:
    z = pat.sub(r'ABCD.R9999\1', s)
    if '.txt' not in z:
        z += '.txt'
    print(' In: {!r}\nOut: {!r}\n'.format(s, z))

<强>输出

 In: 'DH_062_FAT_HSC_H1666_EFTO.FH1666.COMMON.D170801.T0433417'
Out: 'ABCD.R9999.COMMON.D170801.T0433417.txt'

 In: 'DH_062_FAT_MMA_H0927_EFTO.FH0927.COMMON.D170801.T0433417'
Out: 'ABCD.R9999.COMMON.D170801.T0433417.txt'

 In: 'ABCD.FH2237.COMMON.D170701.T1549353'
Out: 'ABCD.R9999.COMMON.D170701.T1549353.txt'

 In: 'P.FH5526.COMMON.D130501.T1243225'
Out: 'ABCD.R9999.COMMON.D130501.T1243225.txt'

 In: 'FS3389.COMMON.D160901.T1539489'
Out: 'ABCD.R9999.COMMON.D160901.T1539489.txt'

 In: 'P.FH5587.COMMON.D150601.T1529158.7073202'
Out: 'ABCD.R9999.COMMON.D150601.T1529158.7073202.txt'

 In: 'EFTO.FH3890.COMMON.D170401.T1332005'
Out: 'ABCD.R9999.COMMON.D170401.T1332005.txt'

 In: 'H1737.COMMON.R201602.D160201.T1725587.txt'
Out: 'ABCD.R9999.COMMON.R201602.D160201.T1725587.txt'

 In: 'EFTO.RH3864.MSPCOBMA.D170421.T1246176'
Out: 'EFTO.RH3864.MSPCOBMA.D170421.T1246176.txt'

 In: 'P.FH2225.COMMON.D170101.T1737084.12016373.txt'
Out: 'ABCD.R9999.COMMON.D170101.T1737084.12016373.txt'

 In: 'P.FH3204.COMMON.D170701.T1549353.txt_20170627_133012.txt'
Out: 'ABCD.R9999.COMMON.D170701.T1549353.txt_20170627_133012.txt'

 In: 'P.RH2312.COMMON.D110301.T1539063.13313178.txt.gz'
Out: 'ABCD.R9999.COMMON.D110301.T1539063.13313178.txt.gz'

我将让您弄清楚如何处理映射到相同输出字符串的名称。

此处的版本仅保留了该名称的DT部分。

pat = re.compile(r'(?:.*)\.COMMON\..*?(D\d*\.T\d*).*$')

for s in data:
    z = pat.sub(r'ABCD.R9999.COMMON.\1.txt', s)
    print(' In: {!r}\nOut: {!r}\n'.format(s, z))