代码之家  ›  专栏  ›  技术社区  ›  sensey

如何处理三人一组的文件

  •  1
  • sensey  · 技术社区  · 8 年前

    例子:

    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
    

    我需要保留3个最近修改的文件 ais ,3个来自 ais_hg ,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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   chepner    8 年前

    首先,获取唯一组的列表。(我假设没有文件的名称中有换行符。)

    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 。当应用于数组时,它将扩展 数组元素,从索引处的元素开始 s 因此,如果在 files 然后 ${#files[@]} 扩展到9。从中减去3剩下6(两者都是 s 在算术上下文中求值),因此我们有一个中间表达式 ${files[@]:0:6}