[英]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.