0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

磁盘满了除了删文件还可以这样

阿铭linux 来源:阿铭linux 作者:阿铭linux 2022-11-09 09:10 次阅读

【需求】

有一个目录/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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 磁盘
    +关注

    关注

    1

    文章

    338

    浏览量

    24883
  • Data
    +关注

    关注

    0

    文章

    61

    浏览量

    38028

原文标题:磁盘满了除了删文件还可以这样

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    除了定时开关机,5G基站还可以这样节省电费

    最近,一篇关于中国联通在每天21:00到次日9:00关闭5G基站,以减少能耗,节约电费的新闻,引起了大量的关注。很多人是在看到这样的报道后才知道,原来5G基站是需要耗费大量电能的。那除了关闭基站,还有什么办法可以节省电费呢?
    的头像 发表于 08-03 06:20 1.2w次阅读

    求...

    本帖最后由 871881392 于 2014-11-28 08:21 编辑 求
    发表于 11-24 14:56

    灯光还可以这样控制

    的智能灯光,可以实现遥控器在通电状态下的自由分组,任性操作,再也不需反复断电的复杂设置分组;未来的智能灯光,除了可以单一控制外还可以批量、大批量实时控制群组灯光的色温亮弱、无限颜色色彩
    发表于 02-25 10:22

    嵌入式linux磁盘被写满了再写会出现什么后果

    ),结果日志缺东少西,断断续续;不腾挪磁盘,再次运行应用,依旧可以正常工作一段时间;==待解释参见:linux的硬盘满了会导致哪些系统调用受影响...
    发表于 11-05 07:03

    高精度的温度控制除了用PID控制还可以用什么算法控制?

    高精度的温度控制,我们除了用PID控制还可以用什么算法控制
    发表于 10-12 08:09

    STM32的SD的读写除了用SPI还可以用什么方式?

    STM32的SD的读写除了用SPI还可以用什么方式
    发表于 10-12 08:32

    按键消抖除了用延时还可以用什么方式?

    按键消抖除了用延时还可以用什么方式
    发表于 10-19 08:04

    电脑c盘满了怎么清理

    打开我的电脑,在C盘上鼠标右键选择“属性”→“清理磁盘”,这样可以先把C盘里的一些表面垃圾和零碎文件清理掉。在进入C盘的“C:\WINDOWS\SoftwareDistribution
    的头像 发表于 03-08 16:16 15.9w次阅读

    Linux系统不停的报磁盘已满应该如何处理

    由于是开发环境,堆满了大量的日志没删,10g了,于是我删除了一些很久的日志,8g。奇怪的事情发生了,命令查看磁盘,依然是100%。linux还是跟windows区别挺大的么,windows我们删
    的头像 发表于 06-27 09:35 2592次阅读

    MySQL磁盘满了应该如何解决

    本文档的主要内容详细介绍的是MySQL磁盘满了应该如何解决。
    发表于 12-26 10:25 1977次阅读

    嵌入式linux磁盘被写满了再写会怎样?

    ),结果日志缺东少西,断断续续;不腾挪磁盘,再次运行应用,依旧可以正常工作一段时间;==待解释参见:linux的硬盘满了会导致哪些系统调用受影响...
    发表于 11-02 14:21 7次下载
    嵌入式linux<b class='flag-5'>磁盘</b>被写<b class='flag-5'>满了</b>再写会怎样?

    没有做LVM的磁盘如何扩容呢

    今天一个学生问我,虚拟机磁盘满了,然后用fdisk工具把原来的磁盘/dev/sda3改为lvm格式,结果不生效。
    的头像 发表于 05-26 11:20 1211次阅读
    没有做LVM的<b class='flag-5'>磁盘</b>如何扩容呢

    linux磁盘空间满了怎么清理

    和告警信息一致,接着我们就是要找到导致磁盘空间满的目录或文件 如何找到占用空间大的目录或文件? 一种比较笨的方法是,在根目录下,通过du -hs命令,列出各目录所占空间大小。
    的头像 发表于 11-09 11:46 732次阅读
    linux<b class='flag-5'>磁盘</b>空间<b class='flag-5'>满了</b>怎么清理

    万万没想到,二极管竟然还可以这样用?

    万万没想到,二极管竟然还可以这样用?
    的头像 发表于 12-15 09:28 156次阅读
    万万没想到,二极管竟然<b class='flag-5'>还可以</b><b class='flag-5'>这样</b>用?

    linux传输一半磁盘满了怎么清理

    常用的方法和工具,帮助您解决磁盘空间不足的问题。 第一部分:确认磁盘使用情况(200字) 在解决磁盘空间不足之前,首先需要确认系统中各个文件夹的使用情况。
    的头像 发表于 11-23 10:34 249次阅读