Linux下面自动清理超过指定大小的文件
思路:
1)查找test目录下的所有的文件
2)判断是否大于100M
3)大于100M则清空
以byte为单位显示文件大小,然后和100M大小做对比. 100M换算成字节为104857600这里判断是否大于等于100M,大于则使用echo语句将对应文件置空。
100M=100*1024*1024=104857600byte
可以使用dd命令创建一些大于和小于100M的文件进行测试
[root@Python test]# dd if=/dev/zero of=/test/sdsds bs=1M count=20 记录了20+0 的读入 记录了20+0 的写出 20971520字节(21 MB)已复制,0.0141979 秒,1.5 GB/秒 [root@Python test]# du -sh ./* 35M ./123 110M ./12sds 215M ./12ssdsds 5.7M ./jumpserver-master.zip 148K ./lnmp1.5.tar.gz 64M ./nextcloud-14.0.1.zip 20M ./Python-3.5.2.tgz 20M ./sdsds [root@Python test]# du -sh -b ./* 36700160 ./123 115343360 ./12sds 225443840 ./12ssdsds 5931629 ./jumpserver-master.zip 149588 ./lnmp1.5.tar.gz 66439148 ./nextcloud-14.0.1.zip 20566643 ./Python-3.5.2.tgz 20971520 ./sdsds [root@Python test]# ls -l ./* -rw-r--r-- 1 root root 36700160 10月 18 11:58 ./123 -rw-r--r-- 1 root root 115343360 10月 18 11:58 ./12sds -rw-r--r-- 1 root root 225443840 10月 18 11:59 ./12ssdsds -rw-r--r-- 1 root root 5931629 10月 18 12:05 ./jumpserver-master.zip -rw-r--r-- 1 root root 149588 10月 18 12:03 ./lnmp1.5.tar.gz -rw-r--r-- 1 root root 66439148 10月 18 12:02 ./nextcloud-14.0.1.zip -rw-r--r-- 1 root root 20566643 10月 18 12:01 ./Python-3.5.2.tgz -rw-r--r-- 1 root root 20971520 10月 18 11:59 ./sdsds 注意: 如果文件是带小数点的M单位,比如文件大小为5.7M,则换算成byte单位时,就不能直接使用5.7*1024*1024=5976883.2这样计算了,因为这个5.7M的大小是估算出来的M单位的大小,不是精确到的. 如果直接加-b参数换算成byte单位大小则就是精确的值了,也可以使用-k参数来进行换算,如下: [root@Python test]# du -sh jumpserver-master.zip 5.7M jumpserver-master.zip [root@Python test]# du -sh -b jumpserver-master.zip 5931629 jumpserver-master.zip [root@Python test]# du -sh -k jumpserver-master.zip 5796 jumpserver-master.zip
方法一: 使用"du -sh -b"或"du -sh -k"来计算文件大小
语法 # du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件] 参数说明: -a或-all 显示目录中个别文件的大小。 -b或-bytes 显示目录或文件大小时,以byte为单位。 -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。 -D或--dereference-args 显示指定符号连接的源文件大小。 -h或--human-readable 以K,M,G为单位,提高信息的可读性。 -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。 -k或--kilobytes 以1024 bytes为单位。 -l或--count-links 重复计算硬件连接的文件。 -L<符号连接>或--dereference<符号连接> 显示选项中所指定符号连接的源文件大小。 -m或--megabytes 以1MB为单位。 -s或--summarize 仅显示总计。 -S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。 -x或--one-file-xystem 一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。 -X<文件>或--exclude-from=<文件> <文件>指定目录或文件。 --exclude=<目录或文件> 略过指定的目录或文件。 --max-depth=<目录层数> 超过指定层数的目录后,予以忽略。 --help 显示帮助。 --version 显示版本信息。 [root@Python test]# du -sh * 35M 123 110M 12sds 215M 12ssdsds 5.7M jumpserver-master.zip 148K lnmp1.5.tar.gz 64M nextcloud-14.0.1.zip 20M Python-3.5.2.tgz 20M sdsds [root@Python test]# du -sh -b * 36700160 123 115343360 12sds 225443840 12ssdsds 5931629 jumpserver-master.zip 149588 lnmp1.5.tar.gz 66439148 nextcloud-14.0.1.zip 20566643 Python-3.5.2.tgz 20971520 sdsds 使用du -sh -b查找出相应文件的大小,同时使用awk 过滤第一个字段,只保留数字 [root@Python test]# du -sh -b * | awk '{ print $1 }' 36700160 115343360 225443840 5931629 149588 66439148 20566643 20971520 [root@Python test]# du -sh -b * | awk '{ print $2 }' 123 12sds 12ssdsds jumpserver-master.zip lnmp1.5.tar.gz nextcloud-14.0.1.zip Python-3.5.2.tgz sdsds
批量处理的脚本
#!/bin/bash #Author:Mr.Ding #Created Time:2018-10-18 10:32:24 #Name:/root/cache_gt_60.sh #Description:清理/test目录下大于或等于100MB的文件; for size in $(du -sh -b /test/* | awk '{ print $1 }') do for file in $(du -sh -b /test/* |grep ${size}|awk '{print $2}') do if [ ${size} -ge 104857600 ];then echo ${file} ${size} echo "" > ${file} fi done done 结合crontab进行定时执行 [root@Python shell]# crontab -l 0 0 * * 6 /bin/bash -x /root/scripts/shell/cache_ge_100.sh 执行脚本后结果如下: [root@Python test]# du -sh * 35M 123 4.0K 12sds 4.0K 12ssdsds 5.7M jumpserver-master.zip 148K lnmp1.5.tar.gz 64M nextcloud-14.0.1.zip 20M Python-3.5.2.tgz 20M sdsds
方法二:使用"ls -l"
ls命令是linux下用来列出目录下的文件. 下面是关于ls的一些常规用法:
ls -a 列出文件下所有的文件,包括以“.“开头的隐藏文件(linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录)。 ls -l 列出文件的详细信息,如创建者,创建时间,文件的读写权限列表等等。 ls -F 在每一个文件的末尾加上一个字符说明该文件的类型。"@"表示符号链接、"|"表示FIFOS、"/"表示目录、"="表示套接字。 ls -s 在每个文件的后面打印出文件的大小。 size(大小) ls -t 按时间进行文件的排序 Time(时间) ls -A 列出除了"."和".."以外的文件。 ls -R 将目录下所有的子目录的文件都列出来,相当于我们编程中的“递归”实现 ls -L 列出文件的链接名。Link(链接) ls -S 以文件的大小进行排序 ls可以结合管道符”|“来进行一下复杂的操作。比如: ls | less用于实现文件列表的分页 [root@Python test]# ls -l 总用量 464692 -rw-r--r-- 1 root root 36700160 10月 18 11:58 123 -rw-r--r-- 1 root root 1 10月 18 15:01 12sds -rw-r--r-- 1 root root 1 10月 18 15:01 12ssdsds -rw-r--r-- 1 root root 104857600 10月 18 15:12 dcml -rw-r--r-- 1 root root 115343360 10月 18 15:12 dcscdxa -rw-r--r-- 1 root root 104857600 10月 18 15:12 dcvbn -rw-r--r-- 1 root root 5931629 10月 18 12:05 jumpserver-master.zip -rw-r--r-- 1 root root 149588 10月 18 12:03 lnmp1.5.tar.gz -rw-r--r-- 1 root root 66439148 10月 18 12:02 nextcloud-14.0.1.zip -rw-r--r-- 1 root root 20566643 10月 18 12:01 Python-3.5.2.tgz -rw-r--r-- 1 root root 20971520 10月 18 11:59 sdsds [root@Python test]# ls -l * | awk '{print $5}' 36700160 1 1 104857600 115343360 104857600 5931629 149588 66439148 20566643 20971520
批量处理的脚本
#!/bin/bash #Author:Mr.Ding #Created Time:2018-10-18 15:14:20 #Name:/root/scripts/shell/cache_ge_100_1.sh #Description:批量清理大于或等于100M的文件. for size in $(ls -l /test/* |awk '{print $5}') do for file in $(ls -l /test/*|grep $size |awk '{print $9}') do if [ ${size} -ge 104857600 ];then echo ${file} ${size} echo "" > ${file} fi done done [root@Python test]# chmod 755 /root/scripts/shell/cache_ge_100_1.sh 加入计划任务同上 执行结果如下: [root@Python test]# du -sh * 35M 123 4.0K 12sds 4.0K 12ssdsds 4.0K dcml 4.0K dcscdxa 4.0K dcvbn 5.7M jumpserver-master.zip 148K lnmp1.5.tar.gz 64M nextcloud-14.0.1.zip 20M Python-3.5.2.tgz 20M sdsds