Shell 保留文件的最新4个版本,并删除其余版本
我正在使用KornShell(ksh)为目录执行清理脚本。 我将文件名前缀保存在文本文件中。在ksh中,我想从文件中读取前缀,匹配文件的模式,并在目录中保留和压缩(.Z)匹配文件的最新四个版本。我想删除剩下的版本。我之所以这样做是因为文件是累积的,我只想保留最新的文件 我的文本文件有如下前缀: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
- 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
我需要一个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我为此添加了更多信息