删除除最新的10个以外的所有目录

时间:2017-07-27 15:38:42

标签: bash build

如何在bash中删除除最新的五个创建目录之外的所有目录(按日期创建时间)?

构建脚本正在使用它,我们希望清除旧版本。感谢。

编辑:修改日期的时间也没问题。

2 个答案:

答案 0 :(得分:2)

获取文件创建时间并非易事。请参阅此处以供参考:https://unix.stackexchange.com/questions/20460/how-do-i-do-a-ls-and-then-sort-the-results-by-date-created

但如果你很高兴到最后修改时间(这应该没问题呢?)那么像这样的单行应该做的事情。

ls -dt */ | tail -n +6 | xargs rmdir

  • ls -d */列表目录-t按顺序列出
  • tail -n +6打印除最后五行之外的所有行
  • xargs rmdir在每个dirs上调用rm -r(或者如果它们非空,则可以使用rm -r

答案 1 :(得分:0)

可以用ls完成,但解析ls输出不安全。

由于没有内置shell来检索文件时间,所以使用perl。

perl -e '
    @A = sort {(stat($a))[9]<=>(stat($b))[9]} <*/>;
    rmdir for splice (@A,0,-10)
'

测试

mkdir tmp && cd tmp
for d in {A..Z}; do mkdir "$d"; done
ls

perl -e '
    @A = sort {(stat($a))[9]<=>(stat($b))[9]} <*/>;
    rmdir for splice (@A,0,-10)
'

ls

编辑:splice(@A,0,-10)可以更改为@A[0..$#A-10],也许更容易阅读。获取除最后10个之外的所有元素。