2013-11-22 95 views
0

我想编写一个KornShell(ksh)脚本来获取目录中文件的最新三个版本,这些文件有很多不同版本的文件(前缀相同但时间戳为后缀的文件),以及压缩它,同时必须删除文件的其余版本(最新的三个版本的文件除外)。 我是KornShell脚本编写新手。任何人都可以提供解决方案吗? 目录结构是这样的:KornShell获取最新文件版本

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

在此我想要最新的3.0版本开始ABCD *为前缀的文件。类似的文件以xyz *开头。

回答

0

毫无疑问,有简单的人,但这里是一个办法:

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

您可以通过更换'ls'通话更好的一个:'echo'或'printf'。 –

+0

@sputnick我可能会替换它,但这需要更多的代码来处理不存在以'$ base'开头的文件的情况。 'ls'已经相当不错了,并且正在报告一个合适的错误信息。 – jlliagre

+0

我不同意,你可以使用'shopt -s nullglob' –

0

一个使用方式:

printf '%s\n' * | 
    perl -F'\'. -lane ' 
     /^abcd/ and 
      $h{ 
       substr($F[1], 4, 4), 
       substr($F[1], 2, 2), 
       substr($F[1], 0, 2) 
      } = $_; 
     END{ 
      $c=0; 
      for (sort $a <=> $b, keys %h) { 
        print $h{$_}; 
        $c++ == 3 and last; 
      } 
     } 
    ' 
+0

我可以在这个脚本中使用korn shell ..im。 – user2496132

0

假设文件修改时间是正确的,也可能是那样简单:

ls -tr abcd* | tail -3