我想做以下事情:
获取给定目录中与给定模式匹配的文件数,例如:
ExtractBackup_{date}.tar.gz
如果该数字为 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 /
祝你好运 :-)