保留该文件的最新4个版本并删除其余版本

时间:2013-12-21 08:17:59

标签: shell unix scripting ksh

我正在使用KornShell(ksh)为目录执行清理脚本。 我将文件名前缀保留在文本文件中。在ksh中,我想从文件中读取前缀,并匹配文件的模式,并保留并压缩(.Z)目录中匹配文件的最新四个版本。我想删除剩余的版本。原因我这样做是因为文件是累积的,我只想保留最新的文件。

我的文本文件有这样的前缀:

  • ABCD
  • XYZ
  • PQR

我的目录有许多不同名称的文件,如

  • ABCD ###。YYYYMMDDXXXXXX.txt
  • ABCD ###。YYYYMMDDXXXXXX.txt
  • abcd ###。YYYYMMDDXXXXXX.txt(有不同的时间戳)
  • XYZ ###。YYYYMMDDXXXXXX.dat
  • XYZ ###。YYYYMMDDXXXXXX.dat
  • XYZ ###。YYYYMMDDXXXXXX.dat
  • str12.YYYYMMDDXXXXXX.txt
  • qwefd.YYYYMMDDXXXXXX.dat

在这个目录中,因为我在文本文件中有前缀abcd,xyz,所以我想压缩带有该前缀的最新4个版本的文件,并删除带有该前缀的其余版本。我不想触摸文本文件中未提及的文件。 我希望下次我想要运行脚本同样保留最新的文件版本并删除剩余的版本(下一次下一次有以前压缩的文件将在那里。)在任何时候我只需要4个最新的文件版本。我可以删除以前压缩的文件。

我需要一个ksh脚本,任何帮助都很明显。

1 个答案:

答案 0 :(得分:1)

首先,你应该使用logrotate而不是重新发明轮子作为一个肮脏的黑客。

那就是说,这是一个可能对你有用的肮脏黑客:

n=2
c=0
ls -r prefix* | while read f; do
    c=$((c+=1))
    if test $c -gt $n; then
        compress "$f"
    else
        rm -f "$f"
    fi
done

为了更准确地匹配文件名的日期部分,您可以这样做:

ls -r prefix.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*.{txt,dat} 2>/dev/null

或者如果extglob启用shopt,那么这类似,但不太严格:

ls -r prefix.+([0-9]).{txt,dat} 2>/dev/null