回答 intordouble 求批量修改文件名的shell脚本 的问题。

intordouble 写到:

我在/opt/aspire/product/wap1860/extractdata/aaa目录有
CRMSEND_0003_591_20080107_001_05.txt
CRMSEND_0003_591_20080108_001_05.txt
CRMSEND_0003_591_20080109_001_05.txt
CRMSEND_0003_591_20080110_001_05.txt
CRMSEND_0009_591_20071101_001_05.txt
CRMSEND_0009_591_20071201_001_05.txt
这些文件;
我现在想要批量的修改文件名
修改规则为   当文件名前12位是’CRMSEND_0003‘   的就把时间加1天

CRMSEND_0003_591_20080108_001_05.txt
CRMSEND_0003_591_20080109_001_05.txt
CRMSEND_0003_591_20080110_001_05.txt
CRMSEND_0003_591_20080111_001_05.txt
当文件名前12位是’CRMSEND_0009‘   的就把时间加一个月

CRMSEND_0009_591_20071201_001_05.txt
CRMSEND_0009_591_20080101_001_05.txt

今天非常高兴intordouble,添加我为好友,看到问题所以要认真回复,哈哈。  
我整理在这里了。

1 测试数据文件和代码:

[

测试文件如下:
zgl]$   ls   aaa
CRMSEND_0003_591_20080107_001_05.txt     CRMSEND_0008_591_20071101_001_05.txt
CRMSEND_0003_591_20080108_001_05.txt     CRMSEND_0009_591_20071101_001_05.txt
CRMSEND_0003_591_20080109_001_05.txt     CRMSEND_0009_591_20071201_001_05.txt
CRMSEND_0003_591_20080110_001_05.txt

CRMSEND_0008*   文件是0003   和   0009   以外多加的,测试代码中读   0003   和0009   添加的。
测试代码如下:
[
#!/bin/sh

#test_path="/opt/aspire/product/wap1860/extractdata/aaa/";
test_path="./aaa/";

###
echo   "-SrcPath-:   $test_path"   ;

file_table=`ls   -l   $test_path   ¦   awk   '{print   $NF}'   ¦   grep   "CRMSEND_000[3,9]"   ¦   sor
t   -t'_'   -r   -k4`;

for   src_name   in   $file_table
do

###
echo   "-SrcName-:   $test_path$src_name"

        src_date="${src_name:17:8}";
###
echo   "-SrcDate-:   $src_date";

        if   [   "${src_name:0:12}"   ==   "CRMSEND_0003"   ];   then
                obj_date=`date   "-d   $src_date   -d   +1   day"   +%Y%m%d`;
        elif   [   "${src_name:0:12}"   ==   "CRMSEND_0009"   ];   then
                obj_date=`date   "-d   $src_date   -d   +1   month"   +%Y%m%d`;
        fi;
###
echo   "-ObjDate-:   $obj_date";

        obj_name="$test_path${src_name:0:17}$obj_date${src_name:25}"

###
echo   "-ObjName-:   $obj_name";

###
mv   $test_path$src_name   $obj_name;
#cp   $test_path$src_name   $obj_name;

read   aa;

done;

exit   0;
]

把cp   改为   mv   就是改名字了。因为测试保留原文件,用了cp拷贝。
楼主的日期0003_591_20080107   0003_591_20080108   0003_591_20080109   0003_591_20080110是0003加1天的话会正好把原来的文件覆盖。
就没有楼主想要的下面4个文件的内容了:
CRMSEND_0003_591_20080108_001_05.txt  
CRMSEND_0003_591_20080109_001_05.txt  
CRMSEND_0003_591_20080110_001_05.txt  
CRMSEND_0003_591_20080111_001_05.txt  

不知道是巧合还是楼主有意留下的一个有意思的问题。
因此,这里取得列表后就需要按照日期降序排列一下,以便不会覆盖原来的文件。

建议:楼主把目标文件放在另一个目录。

copy结果如下:
  zgl]$   ls   aaa
CRMSEND_0003_591_20080107_001_05.txt     CRMSEND_0008_591_20071101_001_05.txt
CRMSEND_0003_591_20080108_001_05.txt     CRMSEND_0009_591_20071101_001_05.txt
CRMSEND_0003_591_20080109_001_05.txt     CRMSEND_0009_591_20071201_001_05.txt
CRMSEND_0003_591_20080110_001_05.txt     CRMSEND_0009_591_20080101_001_05.txt
CRMSEND_0003_591_20080111_001_05.txt


让我们在回答问题时认真一点,代码测试一下想来会更好的。

今天非常高兴intordouble楼主,添加我为好友,过来看到问题所以要认真回复,哈哈。  

]

2 数据文件和代码:

[

#!/bin/sh

###
#test_path="/opt/aspire/product/wap1860/extractdata/aaa/";
test_path="./aaa/";

file_table=`ls   -l   $test_path   ¦   awk   '{print   $NF}'   ¦   grep   "CRMSEND_000[3,9]"   ¦   sor
t   -t'_'   -r   -k4`;

for   src_name   in   $file_table
do
        src_date="${src_name:17:8}";

        if   [   "${src_name:0:12}"   ==   "CRMSEND_0003"   ];   then
                obj_date=`date   "-d   $src_date   -d   +1   day"   +%Y%m%d`;
        elif   [   "${src_name:0:12}"   ==   "CRMSEND_0009"   ];   then
                obj_date=`date   "-d   $src_date   -d   +1   month"   +%Y%m%d`;
        fi;

        obj_name="$test_path${src_name:0:17}$obj_date${src_name:25}"
        mv   $test_path$src_name   $obj_name;

done;

exit   0;

]

##   以上就是楼主想要实现功能的代码

测试文件和结果:
[zgl]$   ls   aaa
CRMSEND_0003_591_20080107_001_05.txt     CRMSEND_0008_591_20071101_001_05.txt
CRMSEND_0003_591_20080108_001_05.txt     CRMSEND_0009_591_20071101_001_05.txt
CRMSEND_0003_591_20080109_001_05.txt     CRMSEND_0009_591_20071201_001_05.txt
CRMSEND_0003_591_20080110_001_05.txt    
[zgl]$   cat   aaa/*.txt
1
2
3
4
5
6
7
[zgl]$   ./zgl008test.sh
[zgl]$   ls   aaa
CRMSEND_0003_591_20080108_001_05.txt     CRMSEND_0008_591_20071101_001_05.txt
CRMSEND_0003_591_20080109_001_05.txt     CRMSEND_0009_591_20071201_001_05.txt
CRMSEND_0003_591_20080110_001_05.txt     CRMSEND_0009_591_20080101_001_05.txt
CRMSEND_0003_591_20080111_001_05.txt    
[zgl]$   cat   aaa/*.txt
1
2
3
4
5
6
7

经过日期的排序,文件内容不会因为日期+1天把原来已经存在的同日期名文件覆盖。

如果做文件名里的日期排序,我想会变成这样的内容:

1
1
1
1
     5      ----  这个是不处理的 0008表示的 为了测试添加。
6
7


OK   到这里。

]

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值