KornShell获取最新的文件版本

时间:2013-11-22 18:45:02

标签: shell unix ksh

我想编写一个KornShell(ksh)脚本来获取目录中文件的最新三个版本,其中包含许多具有各种版本的文件(前缀相同但后缀为时间戳的文件)并压缩它并在同时必须删除文件的其余版本(除了最新的三个版本的文件)。 我是KornShell脚本的新手。任何人都能为我提供解决方案吗? 目录结构如下:

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

在此我想要以abcd *开头的最新3版文件作为前缀。类似的文件以xyz *开头。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
             }
        }
    '

答案 2 :(得分:0)

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

ls -tr abcd* | tail -3
相关问题