Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 保留文件的最新4个版本,并删除其余版本_Shell_Unix_Scripting_Ksh - Fatal编程技术网

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

Shell 保留文件的最新4个版本,并删除其余版本,shell,unix,scripting,ksh,Shell,Unix,Scripting,Ksh,我正在使用KornShell(ksh)为目录执行清理脚本。 我将文件名前缀保存在文本文件中。在ksh中,我想从文件中读取前缀,匹配文件的模式,并在目录中保留和压缩(.Z)匹配文件的最新四个版本。我想删除剩下的版本。我之所以这样做是因为文件是累积的,我只想保留最新的文件 我的文本文件有如下前缀: abcd xyz pqr 我的目录中有许多文件的名称不同,如下所示 abcd###.YYYYMMDDXXXXXX.txt abcd###.YYYYMMDDXXXXXX.txt abcd###.YYY

我正在使用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.yyyymmddxxx.txt
  • qwefd.YYYYMMDDXXXXX.dat
在这个目录中,因为我在文本文件中有前缀abcd,xyz,所以我想压缩带有该前缀的文件的最新4个版本,并删除带有该前缀的其余版本。我不想触摸文本文件中未提及的文件。 我想在下次运行脚本时保留最新的文件版本并删除剩余的版本(因为下次有以前压缩过的文件时会在那里)。在任何时候,我只需要4个最新的文件版本。我可以删除以前压缩的文件


我需要一个ksh脚本,任何帮助都是值得的。

首先,你应该使用
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
或者,如果使用
shopt
启用了
extglob
,则这将是类似的,尽管不太严格:

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

为什么不使用
logrotate
进行此操作?我希望匹配模式与上面提到的文件名相同。文件扩展名对我也很重要。我的问题是…我希望与问题中提到的文件模式正确匹配…例如前缀*.yyymmddxxxxxx.txt,因为我还有前缀*.yyymmddxxxxxx.dat。如何匹配?@user2496132我为此添加了更多信息