网站首页 > linux / 正文
提醒:本文为合集文章,后续会持续更新!
关注我,持续学习shell脚本,每日提升!
【需求】
有一个目录/data/att/,该目录下有数百个子目录,比如/data/att/aming,/data/att/linux.
然后再深入一层为以日期命名的目录,例如 /data/att/aming/20220909,每天会生成一个日期新目录。
由于/data所在磁盘快满了,所以需要将老文件(一年以前的),挪到另外一个目录下 /data1/att下。
示例:
mv /data/att/aming/20211001 /data1/att/aming/20211001
挪完之后,还需要做软链接,
示例:
ln -s /data1/att/aming/20211001 /data/att/aming/20211001
需要写一个脚本,要求/data/att/下所有子目录都要按此操作,脚本会每天01:00 执行一次,任务计划无需考虑,只需要写脚本即可。
提醒:要确保老文件成功挪到/data1/att下之后才能做软链接,需要有日志。
【解析】
要求看起来虽然很多,但本质上就一个核心诉求,将老的文件挪到新的目录,然后将挪走的目录软链接到之前的位置上。
先来分析目录结构。
/data/att/下面有很多子目录,每一个子目录下面又有按日期命名的目录。
而我们要挪走并做软链接的目录就是这个按日期命名的目录。
首先,/data/att/下面有几百个子目录,所以这里需要做一个遍历循环。
然后如何找到每一个子目录下面一年以前的目录呢?
先理一下思路:由于子目录下面是按年月日命名的目录,而且脚本需要每天都执行,那是不是意味着,2022年9月1日要挪走并做软链接的目录是20210901呢?
原则上是这样,但是我们要考虑到一个问题,这个脚本第一次执行时一年以前的目录可不止一个啊。那换一个方法,使用find吧。
而find时,只需要针对/data/att/xxx/下的这一层目录,再往里的子目录就不管了。
find有一个 -maxdepth选项,用来指定目录层级,就可以实现这个目的。
总结一下,命令是这样的
find /data/att/xxx/ -maxdepth 1 -type d -mtime +365
注意,这个-maxdepth 1必须要放到-type d的前面去。
好,找到目录后,接下来就该mv走了。
问题又来了,假如在mv的时候,目标目录已经存在了呢?
虽然这种情况几乎不会发生,但也不排除有此类特例。
而且题目中也要求了,只有成功挪走了,才可以做软链接,如果目标目录已经存在,那mv的时候,会将目录挪到目标目录下面。
说到这,你可能已经懵了,还是举个具体例子吧。
比如,我想将/root/2这个目录挪到/tmp/下去,正常命令是这样的:
mv /root/2 /tmp/2
但是,如果/tmp/2已经存在了,则会将/root/2 放到 /tmp/2/的里面,就变成了 /tmp/2/2
为了避免此类情况发生,我建议使用rsync来做同步,
rsync -a /root/2/ /tmp/2/
这样,就可以保证/root/2/ 和 /tmp/2/ 是一样的了。那你会说,使用rsync后,原来的目录不还存在么?
是的,所以我们就需要额外做一个删除操作,前提是,只有当rsync 执行成功后,才能做删除。删除后,再来做软链接的操作,软链接的命令很简单,不用多解释了 。
最后还有一个要求,就是需要有日志输出,比如是否挪动成功,是否做软链接成功。这就需要使用 $?这个变量来验证了。
这里还有一个知识点需要提醒各位看官。虽然我们find出来的目录最多到日期那一层级,比如:/data/att/aming/20211001,但是 /data1/att/ 那边可不一定有 aming这个子目录啊,所以你要么提前先创建好aming这一层子目录,要么在rsync的时候,让它自动创建。
rsync有一个-R选项,可以做到这点,还是举例子吧:
比如,我想将 /dir1/a/b 同步到 /dir2/a/b ,但是/dir2/a目录不存在,你可以这样做
cd /dir1
rsync -avR a/b /dir2/
这样就会自动创建a/b两层目录,注意,我可是先cd到了/dir1下面,再去rsync -R
【参考答案】
脚本最终是这样的:
#!/bin/bash
main()
{
cd /data/att
for dir in `ls`
do
for dir2 in `find $dir -maxdepth 1 -type d -mtime +365`
do
rsync -aR $dir2/ /data1/att/
if [ $? -eq 0 ]
then
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 &> /tmp/move_old_data_`date +%F`.log
关注"阿铭linux"(全网同名),持续提升!
Tags:linux磁盘满了
猜你喜欢
- 2024-11-26 VMware虚拟机中Linux系统磁盘空间扩容实战
- 2024-11-26 linux 排查磁盘问题的常用命令
- 2024-11-26 Linux 磁盘扩容(非LVM)方式
- 2024-11-26 Linux系统磁盘分区管理LVM概念及扩容操作
- 2024-11-26 linux系统磁盘空间使用情况
- 2024-11-26 k8s自动化运维十二-磁盘管理
- 2024-11-26 linux磁盘空间查看命令(du,df)剩余空间查看详解
- 2024-11-26 linux中crontab定时任务导致磁盘满和云监控未报警的的坑
- 2024-11-26 centos7 提示根目录系统文件已满,如何解决?
- 2024-11-26 Linux 查找占用磁盘IO读写很高的进程方法