删除bash中的N个文件,其中除一个文件名外的所有文件都是时间戳

时间:2017-03-27 16:45:47

标签: bash shell sorting

首先是的,这个问题有几个版本浮现在这个网站上,但我决定问一下,因为我还没有看到我的问题有一个具体的警告,尽管有多年的编程经验,我&#39之前从未真正需要 bash,所以我不具备实践知识来自己解决这个问题。

我在服务器A上有一个增量备份脚本,它使用rsync复制SQL文件。它将这些名为sql/的文件夹同步到名为latest.sql的文件中。这是所有cron jobbed并且工作正常,但我需要在目标服务器B上实现轮换。

我的服务器A脚本的最后一件事就是调用服务器B上的清理脚本。清理脚本应该执行以下操作:

  1. 使用NOWDT="$(date '+%Y-%m-%d_%H_%M_%S')"获取当前时间,使其格式为2017-03-27_17_30_00
  2. 使用latest.sql(同一目录)将${NOWDT}.sql复制到cp
  3. (这是我尚未解决的棘手问题)

    1. 按字母顺序列出文件,因此带时间戳的文件应高于latest.sql(我想保留此文件)。
    2. 如果文件超过四个(三个带时间戳 latest.sql),请删除顶部(早期)文件,直到只有三个带时间戳的文件。
    3. 一旦完成,其中最多应有4个文件:latest.sql和最多三个带时间戳的文件。

      我已经看过this question并且那里有一些好东西,但我对bash脚本的知识不足以找出如何有效地将其修改为适合我的需要。此外,我不知道它有多相关,但我使用的是CentOS 6附带的标准bash shell。

1 个答案:

答案 0 :(得分:1)

ls [0-9]*.sql | sort | head -n -3 | xargs -r rm -f
  1. 列出所有以数字开头并具有扩展名.sql
  2. 的文件
  3. 排序
  4. 删除前3行(提交我们要保留的内容)
  5. 删除剩下的所有文件。 xargs -r从输入中获取文件名并运行rm -f <filenames>-r表示“如果没有输入则不运行”