按时间排序并保留最新的文件或目录
昨天笔者被要求写一个Shell脚本,用来定时(Crontab)删除目录(其目录下第一层只有目录没有文件),只保留最新的,这么简单当然手到擒来:
ls |grep -wv `ls -rt |tail -1` |xargs -L1 rm -rf
但今天回来的时候,又被告知这样不够好,要保留最新的两个目录比较稳妥。好,当然也没有问题:
ls |grep -wv `ls -rt |tail -1` |grep -wv $(ls -rt |tail -2 |grep -wv `ls -rt |tail -1`) |xargs -L1 rm -rf
靠,上面的是人想出来的么,这得是要多没脑子的人才能写出这么白痴的命令,还是用下面的稍好:
ls |grep -wv `ls -rt |tail -1` |grep -wv `ls -rt |tail -2 |head -1` |xargs -L1 rm -rf
很快就写出来,毕竟只要命令加管道,但看了看,这次轮到笔者觉得不够好了,难道以后保留三个目录的时候又要把上一条的命令重复一次,四个、五个呢?加长版?! 想了一下,改成下面这个样:
ls |grep -Ewv `ls -rt |tail -2 |tr '\n' '\|' |sed 's/.$//'` |xargs -L1 rm -rf
这样的话,以后只要改一个数字就好了~
知识点:
grep -Ewv
-E选项,使用正则表达
-w选项,全词匹配防止过多筛选
-v选项,取反过滤列表
ls -rt
-r选项,反转列表
-t选项,由新到旧向下排序
sed 's/.$//'
删除、舍弃最后一个字符