如何在没有find的情况下在linux shell脚本中根据日期查找和删除文件?
发布时间:2021-02-21 11:02:51 所属栏目:Linux 来源:互联网
导读:请注意,我不能在目标环境中使用“找到” 我需要在linux shell脚本中删除超过7天的所有文件.就像是: FILES=./path/to/dirfor f in $FILESdo echo Processing $f file... # take action on each file. $f store current file name # perhaps stat e
请注意,我不能在目标环境中使用“找到” 我需要在linux shell脚本中删除超过7天的所有文件.就像是: FILES=./path/to/dir for f in $FILES do echo "Processing $f file..." # take action on each file. $f store current file name # perhaps stat each file to get the last modified date and then delete files with date older than today -7 days. done 我可以用’stat’来做这件事吗?我试图用 find *.gz -mtime +7 -delete 但发现我不能在目标系统上使用find(没有cron用户的权限,这不能更改).目标系统是Redhat Enterprise. 文件名的格式如下: gzip> / mnt / target03 / rest-of-path / web / backups / DATABASENAME_date“%Y-%m-%d”.gz 解决方法由于你在文件名中有时间,然后使用它来删除时间,这是一些代码:此脚本获取自纪元以来的当前时间(以秒为单位),然后计算7天前的时间戳.然后,对于每个文件,解析文件名并将每个文件名中嵌入的日期转换为时间戳,然后比较时间戳以确定要删除的文件.使用时间戳消除了直接处理日期的所有麻烦(闰年,几个月不同的日子等) 实际删除已注释掉,因此您可以测试代码. #funciton to get timestamp X days prior to input timestamp # arg1 = number of days past input timestamp # arg2 = timestamp ( e.g. 1324505111 ) seconds past epoch getTimestampDaysInPast () { daysinpast=$1 seconds=$2 while [ $daysinpast -gt 0 ] ; do daysinpast=`expr $daysinpast - 1` seconds=`expr $seconds - 86400` done # make midnight mod=`expr $seconds % 86400` seconds=`expr $seconds - $mod` echo $seconds } # get current time in seconds since epoch getCurrentTime() { echo `date +"%s"` } # parse format and convert time to timestamp # e.g. 2011-12-23 -> 1324505111 # arg1 = filename with date string in format %Y-%m-%d getFileTimestamp () { filename=$1 date=`echo $filename | sed "s/[^0-9-]*([0-9-]*).*/1/g"` ts=`date -d $date | date +"%s"` echo $ts } ########################### MAIN ############################ # Expect directory where files are to be deleted to be first # arg on commandline. If not provided then use current working # directory FILEDIR=`pwd` if [ $# -gt 0 ] ; then FILEDIR=$1 fi cd $FILEDIR now=`getCurrentTime` mustBeBefore=`getTimestampDaysInPast 7 $now` SAVEIFS=$IFS # need this to loop around spaces with filenames IFS=$(echo -en "nb") # for safety change this glob to something more restrictive for f in * ; do filetime=`getFileTimestamp $f` echo "$filetime lt $mustBeBefore" if [ $filetime -lt $mustBeBefore ] ; then # uncomment this when you have tested this on your system echo "rm -f $f" fi done # only need this if you are going to be doing something else IFS=$SAVEIFS (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- linux – 使用所有规则删除iptables链
- linux – bash / Makefile中双符号的意思是什么?
- 当我在Linux中打开文件时应该什么时候使用O_CLOE
- linux – 如何在shell脚本中管理日志详细程度?
- 如何在linux mint下的zsh中设置virtualenvwrappe
- gnu-screen – tmux是否具有屏幕所具有的所有功能
- linux – 获取打开特定文件的应用程序列表
- LINUX入门:Ubuntu 14.04配置jdk1.8.0_25并可切换
- linux – cgroups隔离(分离组进程)
- 8 Pratical Examples of Linux “Touch” Comman
热点阅读