繁体   English   中英

如何查找和删除早于 x 的文件,但始终在 linux 中保留一个(synology)

[英]How do I find and delete files older than x but always leave one in linux (synology)

我在我的虚拟机(Debian 11)上运行一个脚本来创建某些文件的备份并将它们发送到我的 NAS(Synology),它们最终位于不同的文件夹中。

例如:

/foo/bar/vm1
/foo/bar/vm2
etc.

在我的 NAS 上,我的任务是查找和删除超过 30 天的备份文件,设置如下。

/bin/find /foo/bar/ -iname '*.backup.tgz' -mtime +30 -delete

这对于保持开启并进行每日备份的 vm 非常有效,但对于大部分时间都处于关闭状态的 vm 则不然。 如何删除超过 30 天的备份,但即使超过 30 天也至少保留一个备份?

在阅读了类似问题的最佳答案后,我找到了针对我的具体案例的解决方案。 我有点太专注于使用 find 而不是 Linux 可以提供帮助的其他十亿种方法。 我为我的解决方案添加了一个相对简短的解释。 mklement0 对我之前提到的最佳答案中的大多数命令进行了更深入的研究。

如果其他人最终在同一个地方,我的问题的解决方案:

for i in $(ls /foo/bar/); do cd /foo/bar/$i && ls -tp | grep -v '/$' | grep ".backup.tgz" | tail -n +30 | xargs -d '\n' -r rm --; done

如果有人可以对此进行改进,请随时留下答案。

简要说明

  • for i in $(ls /foo/bar/); do for i in $(ls /foo/bar/); do一个循环来遍历所有子目录。
  • cd /foo/bar/$i &&进入目录并允许执行另一个命令
  • ls -tp | 列出所有文件并按日期对它们进行排序并将尾随 / 添加到目录
  • grep -v '/$' | 排除目录
  • grep ".backup.tgz" | 只有名称中带有 .backup.tgz 的 grep 文件
  • tail -n +30 | 原封不动地跳过前 30 个条目,因此只跳过比前 30 个文件更旧的 grep 文件
  • xargs -d '\n' -r rm --删除文件
  • ; done ; done结束循环

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM