用于删除文件的shell脚本,其中文件具有序列号

时间:2014-01-12 03:35:43

标签: linux shell

我需要一个用于删除文件的shell脚本,其中文件包含序列号。

例如,有一个类似/abc/def的目录,其中包含以下文件:

xyz_1000_1_pqr.arc
xyz_1001_1_pqr.arc
xyz_1002_1_pqr.arc
xyz_1003_1_pqr.arc
xyz_1004_1_pqr.arc
xyz_1005_1_pqr.arc
xyz_1006_1_pqr.arc
xyz_1007_1_pqr.arc
xyz_1008_1_pqr.arc

这里我需要删除序列号小于(<)1004的所有.arc个文件。也就是说,只有文件:

xyz_1000_1_pqr.arc
xyz_1001_1_pqr.arc
xyz_1002_1_pqr.arc
xyz_1003_1_pqr.arc

应该删除。 (P.S:每个文件都是4-5GB并且很关键)

编辑:

抱歉没有提及早些时候

要求:删除已备份的文件并阻止文件系统达到100%,备份团队提供已备份的最新文件的序列号 如果我能获得一个带有参数的shell脚本(最后一个备份文件的序列号)并删除序列号小于备份团队提供的序列号的所有文件,那将非常方便

我有30多台服务器具有相同的场景,并且每个服务器的起始序列号(最旧文件的序列号)将不同,除非登录到每个服务器并且手动检查目录,否则将无法知道< / p>

因此,一个for循环的起始序列号直到结束序列,而rm是不可能的

可以部署在所有服务器上的通用脚本,它只能处理最近备份的文件的序列号,是我正在寻找的,这样它就可以被称为事件 - 来自工具的反应(OEM12c oracle相关,生成文件系统警报)

截至目前,我正在使用正则表达式手动删除每个服务器,每次触发警报时文件系统超过70%,这是重复和忙乱的,因为我有其他问题(DBA),因此自动脚本将节省我很多时间。

谢谢

2 个答案:

答案 0 :(得分:1)

单程

rm xyz_100{0..3}_1_pqr.arc

如果您有开始和结束序列号,只需循环并删除它们

for (( i=$start_num ; i<=$end_num; i++ ))
do
   rm xyz_${i}_*arc
done

答案 1 :(得分:0)

此脚本以您在命令行中指定的编号开头,并删除具有该编号或更低编号的所有文件,直到它变为文件不存在的编号。

#!/bin/sh
num=$1

for ((i=$num; i>=0; i--))
do
    name=$(printf 'xyz_%03i_1_pqr.arc' $i)
    [ -f "$name" ] || break
    rm "$name"
done

printf语句中的“%03i”格式确保数字一旦格式化,将为三位数或更长。 (这意味着诸如99之类的数字用零填充成为099.)对于printf,“%i”表示格式为整数,“%3i”表示格式化整数并给它至少三个空格,并且“ %03i“表示将整数格式化为三个空格,根据需要用零填充左边。

在这个答案的早期版本中,我让脚本检查所有数字为零,寻找要删除的文件。在评论中,您提到序列号最多可达7位数。这可能会使详尽的方法过于耗时。在这个版本中,我让它倒计时,直到它到达已经删除了备份的序列号,然后停在那里。