在下面/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
o
按m
修改时间排序(最新的在前ls -t
),则.
仅限于常规的文件,N
启用N
ullglob,[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
消除回声才能真正消除它们。
是的:我也觉得它很丑。