我有一个文件夹,其中包含3个月以内且不到1年的备份文件。它们具有相同的名称部分,但另一部分是备份日期(所以我有一组文件)。对于文件夹中的所有文件,我只需要保留每个组中的3个zip文件:不是所有文件中的最后3个修改后的文件,而是每个组中的最后3个文件,因为可以在不同的时间创建备份过去。其他文件,删除。
例子:
压缩文件列表:
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
,从3asf
等,但也有文件(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
首先,获取唯一组列表。(我假设没有文件名称中包含换行符。)
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
数组元素的序列,从index处的元素开始s
。因此,这里,如果有在9个元素files
,然后${#files[@]}
扩大到9,从该叶片6(均减去3s
和l
在算术上下文计算的),所以我们必须的中间表达式${files[@]:0:6}
。结果是数组中的前6个文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句