设置自动清理Linux系统中n天前的文件的方法

   服务器每周会产生一次全局备份文件,大小约100G左右,需要定期清理。

  工作时间网站访问大,服务器I/O高的时候删除大数据会对服务器状态产生不好的影响。于是想利用计划任务自动执行。

  在我的备份目录/bakcup下,每次备份文件均以日期形式命名目录名:

  代码如下:

  # ls

  2013-12-23 2014-01-06 2014-01-20 2014-02-03

  2013-12-30 2014-01-13 2014-01-27 2014-02-10

  删除部分备份同时保留部分,可以使用find命令,如我要保留最近四周备份的文件,每次备份间隔七天:

  代码如下:

  # find /bakcup/ -maxdepth 1 -type d -mtime +28

  /bakcup/2014-01-06

  /bakcup/2014-01-13

  /bakcup/2013-12-23

  /bakcup/2013-12-30

  -maxdepth 1:设置查找目录深度为1,只在/backup目录下查找,如不加此参数会将下级目录中的文件都列出

  -type d:设置查找类型为目录

  -mtime +28:查找28天前的目录

  查找结束后可用-exec参数连接删除命令

  代码如下:

  rsync --delete-before -d /data/test/ {} ;

  所以,整个命令就是:

  代码如下:

  # find /bakcup/ -maxdepth 1 -type d -mtime +28 -exec rsync --delete-before -d /data/test/ {} ;

< p>

 

  最后可以把命令放入脚本,设置crontab自动执行。

  提醒:

  使用命令前,应先在服务器上试用查找部分的命令,如只查找出要清理的目录,则可以继续。

  不排除某些系统会将./目录查找出来,一定要看清楚,防止出现意外情况。

  另外可将-exec替换为-ok,效果相同,在删除前提醒用户确认。

  PS:rm命令与rsync命令的效率比较

  rm

  rm命令大量调用了lstat64和unlink,可以推测删除每个文件前都从文件系统中做过一次lstat操作。

  lstat64的次数低于文件总数,还有另外的原因,之后会在另一篇文章中说明。

  getdirentries64这个调用比较关键。

  过程:正式删除工作的第一阶段,需要通过getdirentries64调用,分批读取目录(每次大约为4K),在内存中建立rm的文件列表;第二阶段,lstat64确定所有文件的状态;第三阶段,通过unlink执行实际删除。这三个阶段都有比较多的系统调用和文件系统操作。

  rsync

  rsync所做的系统调用很少。

  没有针对单个文件做lstat和unlink操作。

  命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。

  只做目录同步,不需要针对单个文件做unlink。

  另外,在其他人的评测里,rm的上下文切换比较多,会造成System CPU占用较多——对于文件系统的操作,简单增加并发数并不总能提升操作速度。

时间: 2024-10-18 05:09:40

设置自动清理Linux系统中n天前的文件的方法的相关文章

在Linux系统中批量删除多个文件的方法总结

  当我们在linux系统中要删除数万或者数十万甚至数百万的文件时使用rm -rf *就不太好用,因为要等待很长一段时间.在这种情况之下我们可以使用linux系统命令rsync来巧妙的处理.rsync实际上用的是替换原理,处理数十万个文件也是秒删. 1. rsync安装,有些系统默认安装有该命令 ubuntu系统: 代码如下: sudo apt-get install rsync fedora 系统: 代码如下: sudo yum install rsync 其他的可以源码安装,到下面的网站下载

linux系统中SecureCRT上传下载文件使用方法

1.在securecrt设置下载上传路径,位于: 英文版 options - session options - X/Y/Zmodem. 中文版 选项- 会话选项- X/Y/Zmodem 2.securct命令 sz用法(send相对于服务器): 下载一个文件 sz filename  下载多个文件 sz filename1 filename2 下载test目录下的所有文件,不包含test的文件夹 sz test/* rz用法(received相对于服务器): 进入要上传到的文件夹,然后输入rz

Linux 系统中使用 logwatch 监控日志文件

Linux 系统中使用 logwatch 监控日志文件 Linux 操作系统和许多应用程序会创建特殊的文件来记录它们的运行事件,这些文件通常被称作"日志".当要了解操作系统或第三方应用程序的行为或进行故障排查时,这些系统日志或特定的应用程序日志文件是必不可少的的工具.但是,日志文件并没有您们所谓的"清晰"或"容易"这种程度的可读性.手工分析原始的日志文件简直是浪费时间,并且单调乏味.出于这个原因,对于系统管理员来说,发现任何一款能把原始的日志文件

在Linux系统中存储设备的两种表示方法

摘要: 硬盘和硬盘分区在Linux都表示为设备,按我们通俗的说法来说,就是怎么来表示或描述硬盘和或硬盘分区,但这种描述应该是科学和具体的:比如IDE硬盘,在Linux 可以表示为 /dev/hda./dev/hdb ... :SCSI 接口的硬盘.SATA接口的硬盘表示为/dev/sda./dev/sdb ... ... :而IDE接口的硬盘/dev/hda,也可以表示为hd0 ,而 SCSI 接口的如果是 /dev/sda ,另一种表示方法是sd0: 理解两种表示方法有何用?至少GRUB引导管

Linux系统中修改与查看文件属性的基本方法

chattr chattr 修改文件在Linux第二扩展文件系统(E2fs)上的特有属性 符号模式有+-=[ASacdisu]几种格式. 操作符`+'用来在文件已有属性的基础上增加选定的属性; `-'用来去掉文件上的选定的属性;而`='用来指定该文件的唯一属性. 字符`ASacdisu'用作文件新属性的选项: 不更新atime(A),同步更新(S),只能添加(a), 压缩(c),不可变(i),不可转移(d),删除保护(s)以及不可删除(u). -R 递归地修改目录以及其下内容的属性. 如果在递归

linux系统中VNC远程桌面安装和配置方法详解

具体方法 1.检查linux系统是否安装VNC命令rpm -q vnc-server 如果没有安装则使用yum install vnc vnc-server 2.启动vnc服务  代码如下 复制代码 vncserver You will require a password to access your desktops. Password: Verify: 输入两次密码,这个就是你远程登陆时所需要的密码. 3.修改配置文件,root账户下  代码如下 复制代码 vi /etc/sysconfi

在Linux系统中修改文本的字符编码的方法

  正如我们所知道的那样,电脑只能够处理低级的二进制值,并不能直接处理字符.当一个文本文件被存储时,文件中的每一个字符都被映射成二进制值,实际存储在硬盘中的正是这些"二进制值".之后当程序打开文本文件时,所有二进制值都被读入并映射回原始的可读字符.只有当所有需要访问这个文件的程序都能够"理解"它的编码,即二进制值到字符的映射时,这个"保存和打开"的过程才能很好地完成,这也确保了可理解数据的往返过程. 如果不同的程序使用不同的编码来处理同一个文件,

Linux系统上解压或挂载img文件的方法

img文件压缩及解压2.6内核中的initrd.img采用cpio压缩,不再是2.4内核使用的ext2格式,无法使用mount -o loop 挂载.需要使用gunzip解压缩,然后再使用cpio解包 代码如下:cp /boot/initrd-***.img initrd.img.gzgunzip initrd.img.gzmkdir initrdmv initrd.img initrdcd initrdcpio -ivmd < initrd.img通过以上命令就将initrd.img解压了,现

在Linux系统中简单地实现定时备份的方法

  运行一个简单的脚本 假设你有一个脚本叫:/usr/local/bin/myscript ,你想要每隔一小时就运行一次. Service 文件 第一步,创建一个service文件,根据你Linux的发行版本放到相应的系统目录(在Arch中,这个目录是/etc/systemd/system/ 或 /usr/lib/systemd/system) myscript.service 代码如下: [Unit] Description=MyScript [Service] Type=simple Exe