【问题标题】:keep latest 4 versions of the file and delete the remaining versions保留文件的最新 4 个版本并删除其余版本
【发布时间】:2013-12-21 08:17:58
【问题描述】:

我正在使用 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 脚本,任何帮助都是可观的。

【问题讨论】:

  • 你为什么不用logrotate呢?
  • 我想要匹配模式,因为上面提到的文件名..文件扩展名对我来说也很重要..'

标签: shell unix scripting ksh


【解决方案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

或者如果extglobshopt 一起启用,那么这将是相似的,但不那么严格:

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

【讨论】:

  • 我的问题是......我想与我的问题中提到的文件模式正确匹配......例如 prefix*.YYYYMMDDXXXXXX.txt 因为我有 prefix*.YYYYMMDDXXXXXX.dat也提供。如何搭配?
  • @user2496132 我为此添加了更多信息
猜你喜欢
  • 2020-05-06
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多