2016-09-14 74 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