KornShell正在获取最新的文件版本

KornShell正在获取最新的文件版本,shell,unix,ksh,perl,Shell,Unix,Ksh,Perl,我想编写一个KornShell(ksh)脚本,以获取目录中文件的最新三个版本,该目录中有许多不同版本的文件(前缀相同但后缀为时间戳的文件),并对其进行压缩,同时必须删除文件的其余版本(文件的最新三个版本除外)。 我是刚接触科恩希尔脚本的。有谁能给我提供解决方案吗? 目录结构如下所示: abcd.11122013.txt abcd.12122013.txt abcd.10122013.txt abcd.09122013.txt xyz.11122013.txt xyz.12122013.txt x

我想编写一个KornShell(ksh)脚本,以获取目录中文件的最新三个版本,该目录中有许多不同版本的文件(前缀相同但后缀为时间戳的文件),并对其进行压缩,同时必须删除文件的其余版本(文件的最新三个版本除外)。 我是刚接触科恩希尔脚本的。有谁能给我提供解决方案吗? 目录结构如下所示:

abcd.11122013.txt
abcd.12122013.txt
abcd.10122013.txt
abcd.09122013.txt
xyz.11122013.txt
xyz.12122013.txt
xyz.10122013.txt
......................

在这里,我想要最新的3个版本的文件,以abcd*开头作为前缀。类似地,文件以xyz*开头

无疑有更简单的方法,但这里有一种方法:

for base in abcd xyz
do
    ls ${base}* | sed 's/\(.*\).\(..\)\(..\)\(....\).txt/\4 \3 \2 \1/' | sort | tail -3 | while read a b c d;do echo $d.$c$b$a.txt; done
done
更新:使用数组存储前缀,并显示为每个文件调用存档函数的一种方法

#!/bin/ksh
typeset -a prefix=(abcd xyz foo bar)
for base in "${prefix[@]}"
do
  for file in $(ls "${base}"* | 
                sed 's/\(.*\).\(..\)\(..\)\(....\).txt/\4 \3 \2 \1/' |
                sort |
                tail -3 |
                while read a b c d; do
                  echo $d.$c$b$a.txt
                done); do
    echo archive $file
  done
done
单向使用:

printf'%s\n'*|
perl-F'\'-莱恩
/^abcd/和
$h{
substr($F[1],4,4),
substr($F[1],2,2),
substr($F[1],0,2)
} = $_;
结束{
$c=0;
用于(排序$a$b,键%h){
打印$h{$};
$c++==3和最后一个;
}
}
'

假设文件修改时间正确,可以简单到:

ls -tr abcd* | tail -3

您可以用一个更好的调用替换
ls
调用:
echo
printf
@sputnick我确实可以替换它,但如果不存在以
$base
开头的文件,则需要多一点代码来处理这种情况
ls
已经非常擅长这样做,并且正在报告适当的错误消息。我不同意,您可以使用
shopt-s nullglob
@sputnick,这是一种巴什主义,而问题是关于ksh的。在任何情况下,如果不存在任何文件,则不会显示错误消息,因此不太方便imho。我可以获得任何方法,例如将所需的前缀文件集保留在数组中,并在korn shell中循环。因为我有不同前缀的文件集。我想获得每个前缀的最新3个文件,并将其存档。
ls -tr abcd* | tail -3