Arrays 如何以三人一组处理文件

Arrays 如何以三人一组处理文件,arrays,bash,sorting,find,uniq,Arrays,Bash,Sorting,Find,Uniq,我有一个文件夹,其中包含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

我有一个文件夹,其中包含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
我需要保留
ais
中的3个最后修改的文件,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

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

接下来,获取与每个组匹配的文件列表,并仅输出最后三个:

while IFS= read -r group; do
  files=( "$group"_*.zip )
  for f in "${files[@]:0:${#files[@]}-3}"; do
    rm "$f"
  done
done < groups.txt
而IFS=read-r组;做
文件=(“$group”*.zip)
对于“${files[@]:0:${#files[@]}-3}”中的f;做
rm“$f”
完成
完成


首先,
“${var:s:l}”
扩展为长度为
l
的子字符串,从
var
值的
s
位置开始。当应用于数组时,它会展开一系列
l
数组元素,从索引
s
处的元素开始。因此,在这里,如果
文件中有9个元素,那么
${#files[@]}
将扩展为9。从中减去3剩下6(在算术上下文中计算
s
l
),因此我们有一个中间表达式
${files[@]:0:6}
。结果是数组中的前6个文件。

移除外部图像链接并提供相同的文本表示。在我看来,您应该考虑一种不同的语言,例如Python或Rub。但这不可能是不幸的:(我必须使用这种语言,因为这是我在新的workbrilliant中的任务,它可以工作,但我还没有测试它……;你能解释一下这行循环是如何工作的吗?${files[@]:0:${files[@]}-3}”;
while IFS= read -r group; do
  files=( "$group"_*.zip )
  for f in "${files[@]:0:${#files[@]}-3}"; do
    rm "$f"
  done
done < groups.txt