获取目录中与某个模式匹配的文件数并删除最旧的文件

获取目录中与某个模式匹配的文件数并删除最旧的文件

我想做以下事情:

  1. 获取给定目录中与给定模式匹配的文件数,例如:

    ExtractBackup_{date}.tar.gz

  2. 如果该数字为 2 或更高,则删除与该模式匹配的最旧的文件。

如何使用 Korn Shell ( .ksh) 脚本执行此操作?

答案1

没有直接的方法来计算与模式匹配的文件数,但您可以通过两个简单的步骤来完成:生成文件列表,并获取列表的长度。假设日期采用 YYYYMMDD 形式(请注意,这会破坏位置参数):

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ -e "$1" ]; then count=$#; else count=0; fi

在 ksh93 中,如果没有文件匹配,您可以通过将列表设为空来简化计数。可移植的是,与任何文件都不匹配的模式将被替换为包含一个单词(即模式本身)的列表; ksh93 有一个构造可以将模式扩展为空列表。 Ksh 有数组,这意味着您不需要破坏位置参数。

backups=(~(N:ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz))
count=${#backups[@]}

如果日期采用 YYYYMMDD 形式,则最旧的文件位于列表中的第一个。

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ $# -ge 2 ]; then rm "$1"; fi

答案2

好的,使用模式作为参数运行此脚本,如果多个文件匹配,它将删除最旧的文件,例如:

$ ksh dtof.sh ?? # this will delete the oldest two-character file

剧本:

for i in "$@"; do
  if [ ! "$oldest" ]; then
    oldest="$i"
    continue
  fi
  if [ "$i" -ot "$oldest" ]; then
    oldest="$i"
    reap="$i"
  else
    reap="$oldest"
  fi
done
[ "$reap" ] && rm "$reap"

答案3

不了解 ksh,所以我会给您一些可以组合的工具。

查找当前文件夹中匹配特定模式的所有文件,并返回计数

find . -maxdepth 1 -type f -name '*.tgz' | wc -l

要选择最旧的文件,请从下面的输出中选择第一个条目

ls -t1p | grep -v /

祝你好运 :-)

相关内容