【问题标题】:Deleting N files in bash where all but one filename are timestamps在bash中删除N个文件,其中除了一个文件名之外都是时间戳
【发布时间】:2017-03-27 16:45:46
【问题描述】:

首先是的,这个问题有几个版本在这个网站上流传,但我决定问一下,因为我还没有看到一个对我的问题有具体警告的版本,尽管有多年的编程经验,但我从来没有真正之前需要 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. 使用cp(相同的目录)将latest.sql复制到${NOWDT}.sql

(这是我还没有解决的棘手部分)

  1. 按字母顺序列出文件,因此时间戳应该在latest.sql 上方(我想保留这个)。
  2. 如果文件超过四个(三个带时间戳的latest.sql),删除最前面(较早)的文件,直到只有三个带时间戳的文件。

完成后,其中最多应该有 4 个文件:latest.sql 和最多三个带时间戳的文件。

我查看了this question,那里有一些好东西,但我只是没有足够的 bash 脚本知识来研究如何有效地修改它以满足我的需要。我也不知道它有多相关,但我使用的是 CentOS 6 附带的标准 bash shell。

【问题讨论】:

    标签: bash shell sorting


    【解决方案1】:
    ls [0-9]*.sql | sort | head -n -3 | xargs -r rm -f
    
    1. 列出所有以数字开头且扩展名为 .sql 的文件
    2. 排序
    3. 删除前 3 行(归档我们要保留的内容)
    4. 删除剩下的所有文件。 xargs -r 从输入中获取文件名并运行 rm -f <filenames>-r 意思是“没有输入就不运行”

    【讨论】:

    • head -n -3 的形式只是 GNU 头。 Posix 没有。您可以使用 tail -n 4 代替它在 Posix 和 Linux / GNU 上工作
    • @komar : sort 不是必需的。 ls 默认以排序方式输出条目。另外,我会用 echo 替换 ls。顺便说一句,这也会产生已经排序的条目,因为这也是通配符扩展的默认值。
    • echols 有什么优势?有什么技术原因更好吗?
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2015-01-02
    • 1970-01-01
    • 2016-05-23
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多