linux find 命令+删除除按日期排序的最后 5 个以外的所有快照文件

linux find 命令+删除除按日期排序的最后 5 个以外的所有快照文件

在下面/zookeeper/version-2,我们有很多zookeeper快照文件

.
.
.

-rw-r--r-- 1 zookeeper hadoop 495333240 Aug  3 14:51 snapshot.5d00011991
-rw-r--r-- 1 zookeeper hadoop 495333240 Aug  3 14:53 snapshot.5d00011992
-rw-r--r-- 1 zookeeper hadoop 495333240 Aug  3 14:56 snapshot.5d00011993
-rw-r--r-- 1 zookeeper hadoop 495333235 Aug  4 06:18 snapshot.5d0001e0b4
-rw-r--r-- 1 zookeeper hadoop 495326760 Aug  5 11:54 snapshot.5d0003660f
-rw-r--r-- 1 zookeeper hadoop 495335787 Aug  6 08:39 snapshot.5d00047faf
-rw-r--r-- 1 zookeeper hadoop 495335268 Aug  7 01:26 snapshot.5d000563eb

我需要排序快照按日期排列文件并删除所有快照除最近 5 个快照文件外的文件。应保留所有其他非快照文件

我创建了以下 cli 语法以删除所有快照文件除最后 5 个按日期排序外,但不确切知道如何将其与find命令集成

ls -ltr zookeeper/version-2 | grep snapshot  | head -n -5 | xargs rm -f

注意最终目标是在 cron job ( crontab ) 中设置 find 命令

预期输出示例

-rw-r--r-- 1 zookeeper hadoop 495333240 Aug  3 14:56 snapshot.5d00011993
-rw-r--r-- 1 zookeeper hadoop 495333235 Aug  4 06:18 snapshot.5d0001e0b4
-rw-r--r-- 1 zookeeper hadoop 495326760 Aug  5 11:54 snapshot.5d0003660f
-rw-r--r-- 1 zookeeper hadoop 495335787 Aug  6 08:39 snapshot.5d00047faf
-rw-r--r-- 1 zookeeper hadoop 495335268 Aug  7 01:26 snapshot.5d000563eb

答案1

直接删除zookeeper快照可能会给hadoop集群带来不可预测的结果。为此目的有一个特定的命令:

zkCleanup.sh -n 5

答案2

zsh

rm -f /zookeeper/version-2/snapshort.*(N.om[6,-1])

如果om om修改时间排序(最新的在前ls -t),则.仅限于常规的文件,N启用Nullglob,[6,-1]选择倒数第六个。如果文件少于 6 个,rm -f则调用时不带参数,但不应抱怨它。

答案3

编辑:好的,这些(正确的)评论对我来说太多了。谢谢。我深入研究了这一点。实际上比我想象的要难。至少解决了“找不到文件”的情况。如果没有找到任何内容,grep 会生成一个非零返回码。干杯。

find /zookeeper/version-2 -type f -name 'snapshot.*' | grep . | \
xargs -I% -n1 bash -c 'ls -tr "$@" || exit 255' _ % | head -n -5 | \
xargs echo rm -v 

消除回声才能真正消除它们。

是的:我也觉得它很丑。

相关内容