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 到这里。
]