目录结构如下:

/data/backup/
├── 20150508
│   ├── access_20150508.gz
│   └── access_20150508.gz.1
├── 20150509
│   ├── access_20150509.gz
│   └── access_20150509.gz.1
├── 20150510
│   ├── access_20150510.gz
│   └── access_20150510.gz.1

需求,将所有的.1结尾的文件移动到/data/backup1/目录下,目录结构不能变,也就是说/data/backup1下也是以日期命名的目录,文件移动到对应目录下面,并且重命名去掉.1


问题重现:

通过一个脚本创建实验需要的文件,脚本内容如下:

#!/bin/sh
for i in `seq 20`
do
  dir_name=$(date +%Y%m%d -d "$i days ago")
  dst_dirname=/data/backup/$dir_name
  mkdir -p $dst_dirname
  cd $dst_dirname 
  #为区分移动后的同名文件,分别写入1和2
  echo "1"> access_${dir_name}.gz
  echo "2"> access_${dir_name}.gz.1
done


解决方法:

还是通过一个脚本来实现:

#!/bin/sh
for file in `find /data/backup/ -name *.gz.1`
do
  dir_name=`echo $file |awk -F/ '{print $4}'`  #提取出目录名
  dst_dir_name=/data/backup1/$dir_name/
  mkdir -p $dst_dir_name   #创建要移动到的目录
  mv $file $dst_dir_name
  cd $dst_dir_name
  rename gz.1 gz ./*  #因为当前目录下只有一个.gz.1的文件,所以可以用*匹配
done

执行脚本后查看结果:

[root@c66-3 data]# tree /data/backup/
/data/backup/
├── 20150508
│   └── access_20150508.gz
├── 20150509
│   └── access_20150509.gz
├── 20150510
│   └── access_20150510.gz
...
[root@c66-3 data]# grep -r 1 /data/backup/
/data/backup/20150524/access_20150524.gz:1
/data/backup/20150514/access_20150514.gz:1
/data/backup/20150519/access_20150519.gz:1
...

[root@c66-3 data]# tree /data/backup1/
/data/backup1/
├── 20150508
│   └── access_20150508.gz
├── 20150509
│   └── access_20150509.gz
├── 20150510
│   └── access_20150510.gz
...
[root@c66-3 data]# grep -r 2 /data/backup1/
/data/backup1/20150524/access_20150524.gz:2
/data/backup1/20150514/access_20150514.gz:2
/data/backup1/20150519/access_20150519.gz:2
...

通过结果可以看出,所有/data/backup/目录下内容是2的.gz.1的文件都已经成功移动到/data/backup1/目录下,并且目录结构保持不变。