在一个目录中,我想根据文件末尾附加的日期删除文件,这些文件是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
与find
和Bash 偏移扩展${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
中)rm
。find ...
答案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
去除