2013-12-21 66 views
0

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

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

  • 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脚本,并且任何帮助都是可观的。

+0

为什么不你为此使用'logrotate'? – janos

+0

我想匹配模式作为上述文件名称..文件扩展名也对我来说很重要。' – user2496132

回答

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 
+0

我的问题是...我想与我的问题中提到的文件模板正确匹配....例如像前缀* .YYYYMMDDXXXXXX.txt,因为我的前缀* .YYYYMMDDXXXXXX.dat也可用。如何搭配? – user2496132

+0

@ user2496132我为此添加了更多信息 – janos

相关问题