Linux中我们经常会处理一些空间占用问题,可能不知不觉中你的系统可用空间就不足了,很多原因就是系统中每天都产生着一系列文件,这些恶文件占用这系统空间,这里就以日志文件为例,一些没必要的日志文件可能会浪费很多的系统空间。我也曾遇到过,系统中的一些错误,导致日志文件大小暴增,不一会系统空间就被占满了。各种各样的情况可能让我们需要定期清理文件,通过定时任务删除指定格式文件。
一、指定时间+指定格式+文件+查找与删除
1.查找
find path -mtime +day -name “filename”
2.删除
find path -mtime +day -name “filename” -exec rm -rf {} \;
3.详解
find:查找命令,查找指定文件
path:绝对路径,指定的需要处理的文件的路径
-mtime:标准语法,使用 find 查找的时候加上-mtime 参数,其含义为查找在指定时间曾被更改过的文件或目录,单位以24小时计算
+day:天数,表示查找多少天之前的文件
-name:标准语法,使用find查找的时候加上-name参数,表示查找指定文件名的文件
filename:指定的文件名,可以是带*的泛指
exec:固定写法,加上-exec 参数可以实现删除,参数含义为假设find指令的回传值为True,就执行该指令
rm -rf:强制+递归删除,所有文件夹和文件
{} \ ;:固定写法,一对大括号+空格++;
二、设置定时执行命令
上面介绍了删除指定格式文件的命令,那每次手动执行必然很不方便,Linux中的cronb正好满足了我们定时执行命令的需求。
1.创建执行定期删除的脚本文件
touch /opt/soft/bin/auto-del-7-days-ago-log.sh
2.给该脚本文件可执行权限
chmod +x auto-del-7-days-ago-log.sh
3.编辑执行删除的脚本
vi auto-del-7-days-ago-log.sh
#!/bin/sh
find path -mtime +7 -name "filename" -exec rm -rf {} \;
4.在定时任务中添加该脚本,设置定时执行
crontab -e
0 0 * * * /opt/soft/log/auto-del-7-days-ago-log.sh
#表示每天00:00执行该删除脚本。
前五位分别表示:分、时、日、月、周
三、crontab命令
(1)定义
crontab是用来定期执行程序的命令。
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
作用途径:系统周期性所要执行的工作;用户自定义的任务,例如本文所言。
(2)语法
crontab [ -u user ] file
或
crontab [ -u user ] { -l | -r | -e }
crontab:
用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。
-u user:
指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
-e:
执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r:
删除目前的时程表
-l:
列出目前的时程表
(3)定时任务内容语法介绍
f1 f2 f3 f4 f5 program
f1:分钟
f2:小时
f3:一个月份中的第几日
f4:月份
f5:一个星期中的第几天
program:要执行的程序,通常是shell脚本文件
注意:
fn为*时,表示每分钟(小时/天...)都要执行program;
fn为m~n时,表示从第m分钟(小时/天...)到第n分钟(小时/天...)这段时间内都要执行program;
fn为*/n时,表示每n分钟(小时/天...)时间间隔执行一次;
fn为a,b,c...时,表示第a,b,c,...分钟(小时/天...)要执行;
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
用户也可以将所有的设定先存放在文件中,用crontab filename的方式来设定执行时间。
(4)实例
* * * * * /bin/ls
# 每一分钟执行一次 /bin/ls
0 6-12/3 * 12 * /usr/bin/backup
# 在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
# 周一到周五每天下午 5:00 寄一封信给 alex@domain.name
20 0-23/2 * * * echo "haha"
# 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
0 */2 * * * /sbin/service httpd restart
# 每两个小时重启一次apache
50 7 * * * /sbin/service sshd start
# 每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop
# 每天22:50关闭ssh服务
0 0 1,15 * * fsck /home
# 每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup
# 每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;
# 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls
# 每月的1、11、21、31日是的6:30执行一次ls命令
四、find命令:
Actions:
( ACTIONS ) Group actions for -o / -a
! ACT Invert ACT’s success/failure
ACT1 [-a] ACT2 If ACT1 fails, stop, else do ACT2
ACT1 -o ACT2 If ACT1 succeeds, stop, else do ACT2
Note: -a has higher priority than -o
-name PATTERN Match file name (w/o directory name) to PATTERN
-iname PATTERN Case insensitive -name
-path PATTERN Match path to PATTERN
-ipath PATTERN Case insensitive -path
-regex PATTERN Match path to regex PATTERN
-type X File type is X (one of: f,d,l,b,c,…)
-perm MASK At least one mask bit (+MASK), all bits (-MASK),
or exactly MASK bits are set in file’s mode
-mtime DAYS mtime is greater than (+N), less than (-N),
or exactly N days in the past
-mmin MINS mtime is greater than (+N), less than (-N),
or exactly N minutes in the past
-newer FILE mtime is more recent than FILE’s
-inum N File has inode number N
-user NAME/ID File is owned by given user
-group NAME/ID File is owned by given group
-size N[bck] File size is N (c:bytes,k:kbytes,b:512 bytes(def.))
+/-N: file size is bigger/smaller than N
-links N Number of links is greater than (+N), less than (-N),
or exactly N
-prune If current file is directory, don’t descend into it
If none of the following actions is specified, -print is assumed
-print Print file name
-print0 Print file name, NUL terminated
-exec CMD ARG ; Run CMD with all instances of {} replaced by
file name. Fails if CMD exits with nonzero
-exec CMD ARG + Run CMD with {} replaced by list of file names
-delete Delete current file/directory. Turns on -depth option
要删除系统中旧文件,就需要使用命令了:
#find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} \;
假如在一个目录中保留最近30天的文件,30天前的文件自动删除
#find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} \;
/tmp –设置查找的目录;
-mtime +30 –设置时间为30天前;
-type f –设置查找的类型为文件;
-name *.sh[ab] –设置文件名称中包含sha或者shb;
-exec rm -f –查找完毕后执行删除操作;
提示:将此命令写入crontab后即可自动完成查找并删除的工作
另外的方法大同小异
#find . -mtime +30 -type f | xargs rm -rf
另外的方法大同小异
#find . -mtime +30 -type f | xargs rm -rf
$find . -type f -cmin +10 -exec rm -rf *.xml {} \;
find . type f -name “debug*” -atime +3 -exec rm -f {} \;
首先cd进入目录:
find . -name “*~” -exec rm {} \;
find . -ctime +n -exec -exec rm -vi {} \;
这里的+n是指多少天以前,比如:+7
find . -ctime +7 -exec -exec rm -vi {} \;
如果不想手动确认,把命令中的-vi改成-fv
find命令.
使用find时要区分清楚atime,ctime,mtime的区别,一般都使用mtime来查找,因为在ls -al显示出来的就是mtime时间戳,可以使用: # find $PAHT -mtime +3 -ok rm {} \;
在交互模式下删除比较保险。
一、按照一定日期格式命名文件
1、按照一定的格式输出日期:
date +”%y%m%d”
格式说明:
% : 印出 %
%n : 下一行
%t : 跳格
%H : 小时(00-23)
%I : 小时(01-12)
%k : 小时(0-23)
%l : 小时(1-12)
%M : 分钟(00-59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00-60)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区
日期方面 :
%a : 星期几 (Sun-Sat)
%A : 星期几 (Sunday-Saturday)
%b : 月份 (Jan-Dec)
%B : 月份 (January-December)
%c : 直接显示日期与时间
%d : 日 (01-31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001-366)
%m : 月份 (01-12)
%U : 一年中的第几周 (00-53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0-6)
%W : 一年中的第几周 (00-53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000-9999)
2、命名带有日期的文件:filename`date +%y%m%d`,此处的”`”不是单引号。
二、以创建文件日期为界线删除文件
1、find命令简解
find pathname -options [-print -exec -ok …]
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
options:
-name
按照文件名查找文件。
-perm
按照文件权限来查找文件。
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件, – n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:
b – 块设备文件。
d – 目录。
c – 字符设备文件。
p – 管道文件。
l – 符号链接文件。
f – 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
对于时间相关的参数,有以下补充:
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变文件状态的文件
-ctime n
查找系统中最后n*24小时被改变文件状态的文件
-mmin n
查找系统中最后N分钟被改变文件数据的文件
-mtime n
查找系统中最后n*24小时被改变文件数据的文件
2、删除固定日期以前的文件
find logs -type f -mtime +5 -exec rm { } \;
1.创建一个基准时间文件
//比如创建一个“创建时间”为2010年01月01日00时00分的文件– time_file
//时间格式为 [[CC]YY]MMDDhhmm[.ss]
# touch -t 201001010000 time_file
2.证实一下
# ll –time-style=long-iso time_file
-rw-rw-r– 1 work work 0 2010-01-01 00:00 time_file
3.找到并删除基准时间前的文件
# find . ! -newer time_file | xargs rm
4.删除基准文件
# rm -rf time_file
注:如果是要根据修改时间,则把newer改成cnewer,如果是根据访问时间,则把newer改为anewer
查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用- n e w e r选
项。它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。
$ find . / -newer age.txt ! -newer belts.txt -exec ls -l {} \;
这里有两个文件,它们的更改时间大约相差两天。
下面给出的find命令能够查找更改时间比文件age.txt新但比文件belts.txt旧的文件:
如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成
的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决
这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用t o u c h
命令来实现。
假设现在的时间是2 3 : 4 0,希望查找更改时间在两个小时以内的文件,可以首先创建这样
一个文件:
$ touch -t 05042140 time.txt
$ ls -l time.txt
-rw-r–r– root root 0 May 4 21:40 time.txt
一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间
是2 1 : 4 0,比现在刚好早两个小时。
现在我们就可以使用find命令的-newer选项在当前目录下查找所有更改时间在两个小时以
内的文件:
$ find ./ -newer time.txt -print
微信赞赏支付宝赞赏