当每组文件名的文件数 >N 个时删除 XML 文件

当每组文件名的文件数 >N 个时删除 XML 文件

在一个目录中,我想根据文件末尾附加的日期删除文件,这些文件是XML备份文件。应根据以下标准删除文件。

在每个集中,如果它包含的文件数超过 12(每个特定备份文件集的名称),则删除旧文件,最新文件应保留在同一目录中。

例子

套装 1:
Wf_ABCDEF_HGD_AFFGF_DFDF_201601011224.XML

笔记:上述组 1 中的文件不应删除。

套装 2:
Wf_ABHGD_AFFGF_DFDF_201101211221.XML   
Wf_ABHGD_AFFGF_DFDF_201202211222.XML   
Wf_ABHGD_AFFGF_DFDF_201304411223.XML   
Wf_ABHGD_AFFGF_DFDF_201406611224.XML   
Wf_ABHGD_AFFGF_DFDF_201508811225.XML   
Wf_ABHGD_AFFGF_DFDF_201609911226.XML   
Wf_ABHGD_AFFGF_DFDF_201707711227.XML   
Wf_ABHGD_AFFGF_DFDF_201801081228.XML   
Wf_ABHGD_AFFGF_DFDF_201901911229.XML   
Wf_ABHGD_AFFGF_DFDF_202001811210.XML   
Wf_ABHGD_AFFGF_DFDF_202101511211.XML   
Wf_ABHGD_AFFGF_DFDF_202201811212.XML   
Wf_ABHGD_AFFGF_DFDF_202301811213.XML   
Wf_ABHGD_AFFGF_DFDF_202401911214.XML   
Wf_ABHGD_AFFGF_DFDF_202501041215.XML   
Wf_ABHGD_AFFGF_DFDF_202601031216.XML

应删除以下文件,因为根据文件附加日期这些文件是旧文件。

Wf_ABHGD_AFFGF_DFDF_201101211221.XML
Wf_ABHGD_AFFGF_DFDF_201202211222.XML
Wf_ABHGD_AFFGF_DFDF_201304411223.XML
Wf_ABHGD_AFFGF_DFDF_201406611224.XML
第 3 组:-
Wf_ABCDEFGHIJKLMONM_201101211221.XML   
Wf_ABCDEFGHIJKLMONM_201202211222.XML   
Wf_ABCDEFGHIJKLMONM_201304411223.XML
Wf_ABCDEFGHIJKLMONM_201406611224.XML   
Wf_ABCDEFGHIJKLMONM_201508811225.XML   
Wf_ABCDEFGHIJKLMONM_201609911226.XML   
Wf_ABCDEFGHIJKLMONM_201707711227.XML   
Wf_ABCDEFGHIJKLMONM_201801081228.XML   
Wf_ABCDEFGHIJKLMONM_201901911229.XML   
Wf_ABCDEFGHIJKLMONM_202001811210.XML   
Wf_ABCDEFGHIJKLMONM_202101511211.XML

不应删除上述文件,因为该组文件数量等于或低于 12 个。

答案1

findBash 偏移扩展${parameter:offset:length},你可以这样做:

find -type f -execdir bash -c 'printf "%s\n" "${@:1:${#@}-12}" ' _ {} +
./Wf_ABHGD_AFFGF_DFDF_201101211221.XML
./Wf_ABHGD_AFFGF_DFDF_201202211222.XML
./Wf_ABHGD_AFFGF_DFDF_201304411223.XML
./Wf_ABHGD_AFFGF_DFDF_201406611224.XML

返回${#@}文件总数(或平均值参数)。

-name通过在上面的 find 命令选项中指定模式,对您拥有的每组文件重复上述操作。

或者通过脚本获取模式:

# !/bin/bash

allFILEs=(*.XML)
PATTERNs=$(printf "%s\n" "${allFILEs[@]%_*}" |sort -u)

for pattern in ${PATTERNs[@]};
do
    find -type f -name "*${pattern}*" -execdir bash -c '
        printf "%s\n" "${@:1:${#@}-12}"' _ {} + 2>/dev/null;
done

当您进行测试并查看正在删除哪些文件时,请更改(在命令printf中)rmfind ...

答案2

以下代码应该可以完成所有场景:

您的所有 3 个场景仅满足一种条件,如果备份文件数大于 12,我们需要删除最旧的文件

cd /path/to/dir
FilePattern=(`ls --format single-column *.XML | rev | cut -d '_' -f2-  | rev | sort -u`)

for FILE in ${FilePattern[@]}
do
    File_count=`ls "$FILE"_*.XML | wc -w`
    if [ $File_count -gt 12 ]; then
        REMOVE_count=`expr $File_count - 12`
        ls --format single-column "$FILE"_*.XML | head -n $REMOVE_count |  xargs rm -f
    fi
done
  • File_count将获取目录中可用文件的数量
  • if仅当文件计数大于 12 时,删除过程才会开始。
  • REMOVE_count计算大于12的文件数
  • ls --format single-column将按升序在单列中列出文件。
  • head获取最旧的文件
  • rm去除

相关内容