如何查找具有相似文件名的文件以及awk中有多少文件

时间:2013-02-11 15:08:46

标签: linux shell file-io awk

我的任务是从我们的Linux数据库中删除旧的备份文件(除了最新的3之外)。由于我们有多种备份,因此我必须为每种备份类型留下至少3个备份文件。

我的脚本应该将具有相似(匹配)名称的所有文件组合在一起并删除除最后3个文件之外的所有文件(我假设操作系统将为我排序这些文件,因此最新的备份也将是最后的备份)

文件的格式为project_name.000000-000000.svndmp.bz2,其中0可以是任意数字,project_name可以是任意名称。前6位数字是名称的一部分,而后6位数字描述备份的版本。

到目前为止,我的代码看起来像这样:

for i in *.svndmp.bz2 # only check backup files
do
    nOfOccurences = # Need to find out, how many files have the same name
    currentFile = 0
    for f in awk -F"[.-]" '{print $1,$2}' $i # This doesn't work
    do
        if [nOfOccurences - $currentFile -gt 3]
        then
            break
        else
            rm $f
            currentFile++
        fi
    done
done

我知道,在继续下一次备份之前,我的脚本可能会尝试删除旧版本的备份4次。我没有寻求性能或效率(我们没有那么多备份)。

我的代码是4小时搜索网络的结果,我用完了很好的Google查询(而且我的老板开始怀疑为什么我还没有回到我的日常任务)< / p>

关于如何解决我的问题,有人可以给我一些意见吗?

  • 查找nOfOccurences
  • 让awk找到符合模式"$1.$2-*"
  • 的文件

1 个答案:

答案 0 :(得分:2)

尝试这个,看看它是否符合你的要求。

for project in `ls -1 | awk -F'-' '{ print $1}' | uniq`; do
    files=`ls -1 ${project}* | sort`
    n_occur=`echo "$files" | wc -l`
    for f in $files; do
        if ((n_occur < 3)); then
           break
        fi
        echo "rm" $f;
        ((--n_occur))
    done
done

如果输出似乎没问题,只需更换回声线。 啊,如果有什么事情发生的话,不要打败我。使用风险仅由您自己承担。