Index
- 有一个目录/data/att/,该目录下有数百个子目录,比如/data/att/aming,/data/att/linux
- 然后再深入一层为以日期命名的目录,比如/data/att/aming/20231009,
- 每天都会生成一个日期新目录,由于/data所在磁盘快满了,
- 所以需要将老文件(一年以前的)挪到另外一个目录/data1/att下,
- 示例:mv /data/att/aming/20240428 /data1/att/aming/20240428
- 挪完之后,还需要做软链接,
- 示例:ln -s /data1/att/aming/20240428 /data/att/aming/20240428
- 写一个脚本,要求/data/att写所有目录子目录都要按此操作,
- 脚本会每天01:00执行一次,任务计划无需考虑,只需要写脚本即可
- 提醒:要确保老文件成功挪到/data1/att下之后才能做软链接,需要有日志
#!/bin/bash ##先定义一个main函数,目的是为了后面调用函数,方便记录日志 main() { cd /data/att ## 遍历第一层目录 for dir in `ls` do ## 遍历第二层目录,用find只找当前目录一年以前的子目录 for dir2 in `find $dir -maxdepth 1 -type d -mtime +365` do ## 将目标目录下的文件同步到/data/att/目录下,注意这里的-R可以自动创建目录结构 rsync -aR $dir2/ /data1/att/ if [ $? -eq 0 ] then ## 如果同步成功,会将/data/att下的目录删除 rm -rf $dir2 echo "/data/att/$dir2 移动成功" ## 做软连接 ln -s /data1/att/$dir2 /data/att/$dir2 && \ echo "/data/att/$dir2成功创建软链接" echo else echo "/data/att/$dir 未移动成功" fi done done } ## 调用main函数,并将输出写入日志里, 日志每天一个 main &> /tmp/move_old_data_`date +%F`.log
总结¶
- 可以通过main函数的形式来方便定义脚本日志
- find 使用-maxdepth定义查找目录层级
- 脚本某行很长的话,可以使用" + 回车"来换行,但本质上还是一行内容
- rsync的-R选项可以自动级联创建目录层级
find $dir -maxdepth 1 -type d -mtime +365
:用于查找指定目录 dir 下修改时间超过 365 天的所有目录,$dir表示要查找的目录的路径,-maxdepth 1指定搜索的最大深度为1,即只搜索指定目录下的直接子目录,不会递归地搜索子目录的子目录。rsync -aR $dir2/ /data1/att/
:将源目录 $dir2 下的所有文件和子目录(保持原有目录结构)同步到目标目录 /data1/att/ 下,同时保持文件的所有特性。if [ $? -eq 0 ]
:如果上一个命令的退出状态码为 0(即命令执行成功),则执行 if 语句中的代码块;否则,执行与 if 语句关联的 else 语句中的代码块。