2013-11-22 151 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