1

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

2 回答 2

2

除了几个小问题外,该脚本总体上看起来不错。我的猜测是您想添加-daystart到选项列表中,因此-mtime测试的基础是“从今天开始而不是从 24 小时前开始测量的。此选项仅影响稍后出现在命令行上的测试。”

如果你有 GNU find,那么试着find -D tree,search,stat,rates看看发生了什么。

一些评论:

  • 始终引用变量以确保奇数空格不会产生影响:/usr/bin/find "$CLEANDIR" -name "*.$2" -mtime "+$3" .... 与CLEANDIR="$1"
  • 不要用 终止行;,这是不好的风格。
  • 您可以替换-exec ls -ltr {} \;-ls-print。这样,您不必运行两次 find 命令。
  • 您应该引用{},因为某些 shell 将它们解释为特殊字符。
于 2013-09-26T16:11:34.697 回答
1
  • man find
  • -mtime提到阅读评论-atime
  • “当找出最后一次访问文件的时间是多少 24 小时前,任何小数部分都将被忽略,因此要匹配 -atime +1,文件必须至少在两天前被访问过。” 所以这对于 也是如此-mtime
于 2013-09-26T16:04:10.097 回答