2016-09-14 77 views
1

我有一個文件夾,其中包含3個月和1年以下的備份文件。他們有相同的部分名稱,但其他部分是備份日期(所以我有一組文件)。從我的文件夾中的所有文件中,我只需要保留每個組中的3個zip文件:不是來自所有文件的最後3個修改文件,而是每個組的最後3個文件,因爲可以在不同的時間創建備份過去。其他文件,刪除。如何處理三個文件組中的文件

例子:

的zip文件列表:

ais_2016-02-21.zip 
ais_hg_2016-07-31.zip 
ais_hg_2016-08-07.zip 
ais_hg_2016-08-14.zip 
ais_hg_2016-08-21.zip 
ais_hg_2016-08-28.zip 
ais_hg_2016-09-04.zip 
asf_2016-07-17.zip 
asf_2016-07-24.zip 
asf_2016-07-31.zip 
asf_2016-08-07.zip 
asf_2016-08-14.zip 
asf_2016-08-21.zip 
asf_2016-08-28.zip 
asf_2016-09-04.zip 
asf-ant-tasks_2015-12-13.zip 
asf-ant-tasks_2015-12-27.zip 
asf-ant-tasks_2016-01-17.zip 
asf-ant-tasks_2016-01-31.zip 
asf-ant-tasks_2016-02-14.zip 
asf-ant-tasks_hg_2016-02-28.zip 
asf-ant-tasks_hg_2016-08-07.zip 
asf-ant-tasks_hg_2016-08-14.zip 
asf-ant-tasks_hg_2016-08-21.zip 
asf-ant-tasks_hg_2016-08-28.zip 

組:

ais 
ais_hg 
asf 
asf-ant-tasks 
asf-ant-tasks_hg 

,我需要從aisais_hg保持3個最後修改的文件,3,3從asf等等。但是,有更多的文件組(130),所以我無法手動編寫腳本中的每個組。

所以我在這裏。我有兩個陣列,我不知道從哪裏出發。

#!/bin/bash 

files=(/media/sf/zipp/outOFtime/*.zip) 
cuts=($(find ${files[@]} -type f | sed 's/.{15}$//' | sed 's/^.{1}//' | sort |uniq)) 

for f in "${cuts[@]}" 
do 
    echo -e $f 
done 
+0

刪除外部圖像鏈接並提供相同的文本表示。 – Inian

+0

在我看來,你應該考慮一個不同的語言,比如Python或Ruby。 –

+0

但這是不可能的不幸:(我必須使用這種語言,因爲這是我的任務在我的新作 – sensey

回答

1

首先,獲取唯一組的列表。 (我假設沒有任何文件的名稱中換行。)

for f in *.zip; do 
    echo "${f%%_*}" 
done | sort -u > groups.txt 

接下來,獲得各組匹配的文件列表,並輸出只有最後三:

while IFS= read -r group; do 
    files=("$group"_*.zip) 
    for f in "${files[@]:0:${#files[@]}-3}"; do 
    rm "$f" 
    done 
done < groups.txt 

首先,"${var:s:l}"擴展到長度爲l的子字符串,其起始位置s的值爲var。應用於數組時,它將擴展一系列l數組元素,從索引s處的元素開始。因此,在這裏,如果files中有9個元素,則${#files[@]}將擴展爲9.從此樹葉中減去3(因爲sl都在算術上下文中計算),所以我們有一箇中間表達式${files[@]:0:6}。那麼結果就是數組中的前6個文件。

+0

輝煌,它的工作原理,但我還沒有測試它......;你能解釋我這條循環是如何做的嗎?工作?「$ {files [@]:0:$ {#files [@]} - 3}」; – sensey