【问题标题】:How to find files with similar filename and how many of them there are with awk如何查找具有相似文件名的文件以及使用 awk 的文件有多少
【发布时间】:2013-02-11 15:08:46
【问题描述】:

我的任务是从我们的 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 小时的结果,但我的谷歌查询已经用完了(我的老板开始想知道为什么我还没有回到我的日常任务中)

谁能给我意见,我可以如何解决我的问题?

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

【问题讨论】:

  • (我假设操作系统会为我对这些文件进行排序,所以最新的备份也将是最后的备份) ...好吧,现在,就这样假设不是一件好事。目录条目以任意顺序返回,您必须自己对它们进行排序。为什么不用自己熟悉的编程语言?
  • @derobert 那将是 C#,我必须在数据库服务器上安装 Mono,我的雇主肯定会反对。
  • 发布一些示例输入和预期输出,因为您的描述不明确,我们无法从代码中判断您想要做什么,因为如果代码执行您想要的操作,您就不会问这个问题.

标签: linux shell file-io awk


【解决方案1】:

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

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

如果输出看起来没问题,只需替换 echo 行。 啊,如果有什么属于自己的,请不要打我。使用风险自负。

【讨论】:

  • 它就像一个魅力,删除了太多的虚拟备份,但感谢您的输入,我能够完成我的脚本。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2021-09-24
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多