【问题标题】:Remove older backup from directory using shell command使用 shell 命令从目录中删除旧备份
【发布时间】:2014-08-08 17:07:07
【问题描述】:

在我的 shell 脚本中,我正在创建我的文件夹的备份。我正在通过 cronjob 设置此活动,并且时间表不断变化。

它正在保存带有时间戳的备份。例如:

cd /tmp/BACKUP_DIR

backup_06-05-2014.tar
backup_06-08-2014.tar
backup_06-10-2014.tar

我想要什么,每当我运行脚本时,它应该只保留最新的和以前备份的。并删除剩余的备份。

如果我现在运行脚本,它应该保留

backup_06-10-2014.tar
backup_06-18-2014.tar

然后删除所有其他的。我应该使用什么rm 命令?

【问题讨论】:

  • 我建议在文件名中使用 YYYYMMDD 日期格式,按升序/降序排序,选择并删除列表中的第一个/最后一个。

标签: linux shell unix awk crontab


【解决方案1】:

尝试如下:

rm $(ls -1t /tmp/BACKUP_DIR | tail -n +2)

列表按日期名称排序,仅剩下两个最新的文件

【讨论】:

  • 真棒优雅的解决方案!
  • 在我的 Mac 上,我必须添加一个以获得正确的行数,所以对于两个最新的我必须使用 rm $(ls -1t /tmp/BACKUP_DIR | tail -n +3)
【解决方案2】:

您可以尝试使用 find 命令删除超过 7 天的文件,例如:

find /tmp/BACKUP_DIR -maxdepth 1 -type f -name "backup_*.tar" -mtime +6 -exec rm -f {} \;

【讨论】:

    【解决方案3】:

    使用

    rm -rf `ls -lth backup_*.tar | awk '{print $NF}' | tail -n +4`
    
    1. ls -lth backup_*.tar 将给出备份文件的排序列表(最新的在顶部)
    2. awk '{print $NF}' 将打印文件名并将其传递给 tail
    3. tail -n +4 ,将从数字 3 开始打印文件
    4. 最后将 tail 的结果输入到 rm 中进行操作

    另一种简化方法

    rm -rf `ls -1rt backup_*.tar | tail -n +3`
    

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2017-10-13
      • 2012-07-08
      • 2016-12-17
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多