按时间排序并保留最新的文件或目录

Published: Tags: SHELL

昨天笔者被要求写一个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/.$//' 
        删除、舍弃最后一个字符