在unix shell脚本中删除旧文件的可靠方法

时间:2013-09-26 15:43:52

标签: shell unix

我正在尝试使用find构建一个可靠的shell脚本来删除基于Xn天数的旧文件。但是,脚本似乎间歇性地工作。有没有更好的办法?我首先列出文件以确保捕获它们,然后使用-exec rm{}删除它们。

我像这样执行脚本: /home/scripts/rmfiles.sh /u05/backup/export/test dmp 1

#!/usr/bin/ksh

if [ $# != 3 ]; then
   echo "Usage: rmfiles.sh <directory> <log|dmp|par> <numberofdays>" 2>&1
   exit 1
fi

# Declare variables
HOURDATE=`date '+%Y%m%d%H%M'`;
CLEANDIR=$1;
DELETELOG=/tmp/cleanup.log;

echo "Listing files to remove..." > $DELETELOG 2>&1
/usr/bin/find $CLEANDIR -name "*.$2" -mtime +$3 -exec ls -ltr {} \; > $DELETELOG 2>&1

echo "Removing files --> $HOURDATE" > $DELETELOG 2>&1
#/usr/bin/find $CLEANDIR -name "*.$2" -mtime +$3 -exec rm {} \; > $DELETELOG 2>&1

我的示例目录显然有比今天更早的文件,但find在以前的某些测试中没有提到它。

Thu Sep 26 08:54:57 PDT 2013

total 161313630
-rw-------   1 oracle     dba        10737418240 Sep 24 14:17 testexp01.dmp
-rw-------   1 oracle     dba        10737418240 Sep 24 14:20 testexp02.dmp
-rw-------   1 oracle     dba        10737418240 Sep 24 14:30 testexp03.dmp
-rw-------   1 oracle     dba            508 Sep 24 15:41 EXPORT-20130924.log
-rw-------   1 oracle     dba            509 Sep 25 06:00 EXPORT-20130925.log
-rw-------   1 oracle     dba            508 Sep 26 08:30 EXPORT-20130926.log

2 个答案:

答案 0 :(得分:2)

除了一些小问题之外,该脚本一般看起来很好。我的猜测是,您希望将-daystart添加到选项列表中,以便从今天开始而不是从24小时前开始测量-mtime测试的基础。此选项仅影响稍后在命令行中显示的测试。&#34;

如果您有GNU查找,请尝试find -D tree,search,stat,rates查看发生了什么。

一些意见:

  • 始终引用变量以确保奇数空格不起作用:/usr/bin/find "$CLEANDIR" -name "*.$2" -mtime "+$3" ...。与CLEANDIR="$1"
  • 相同
  • 不要使用;终止行,这是一种不好的风格。
  • 您可以将-exec ls -ltr {} \;替换为-ls-print。这样,您就不必两次运行find命令。
  • 你应引用{},因为有些shell会将它们解释为特殊字符。

答案 1 :(得分:1)

  • man find
  • -mtime提及阅读-atime
  • 上的评论
  • “当找到上次访问文件24小时前的数据时,会忽略任何小数部分,因此为了匹配-atime +1,必须至少在两天前访问一个文件。“所以-mtime也是如此。