【问题标题】:KornShell getting latest file versionsKornShell 获取最新文件版本
【发布时间】:2013-11-22 18:45:02
【问题描述】:

我想编写一个 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* 开头的文件。

【问题讨论】:

    标签: shell unix ksh


    【解决方案1】:

    假设文件修改时间是正确的,它可以很简单:

    ls -tr abcd* | tail -3
    

    【讨论】:

      【解决方案2】:

      使用 的一种方式:

      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;
                   }
              }
          '
      

      【讨论】:

        【解决方案3】:

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

        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
        

        【讨论】:

        • 您可以将ls 调用替换为更好的调用:echoprintf
        • @sputnick 我可能确实会替换它,但这需要更多代码来处理不存在以$base 开头的文件的情况。 ls 已经很擅长了,并且正在报告适当的错误消息。
        • 我不同意,你可以使用shopt -s nullglob
        • @sputnick 这是一个 bashism,而问题是关于 ksh。无论如何,如果不存在文件,那将不会显示错误消息,因此不太方便恕我直言。
        • 我能得到任何方法,比如将所需的前缀文件集保存在数组中并在 korn shell 中循环。因为我有不同前缀的不同文件集。我想获取每个前缀的最新 3 个文件并将其存档。
        猜你喜欢
        • 2011-11-04
        • 2016-09-08
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多