【问题标题】:Delete all folders execpt the last 10 versions删除除最后 10 个版本之外的所有文件夹
【发布时间】:2020-09-08 14:23:33
【问题描述】:

我有一个文件夹,里面有文件夹,命名为 1.1、1.2、1.3 ... 1.30。

我想删除除最近 10 个版本之外的所有文件夹

所以删除除 1.20、1.21、1.22、1.23、1.24、1.25、12.26、1.27、1.28、1.29、1.30 以外的所有文件夹

我还想确保如果有 10 个或更少,那么没有一个会被删除

类似的作品,但它不会保留最后 10 个版本

ls | sort -v | head -n +10 | xargs -I {} rm -- {}

我该怎么做?

【问题讨论】:

标签: bash unix scripting


【解决方案1】:

这是一种方法:

$ for n in {01..30}; do mkdir "1.$n"; done
$ find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' dir; do if (( 10#${dir##*.} < 20 )); then rmdir $dir; fi; done
$ ls -1
1.20
1.21
1.22
1.23
1.24
1.25
1.26
1.27
1.28
1.29
1.30

【讨论】:

    【解决方案2】:

    为了保留 10 个(或更少)目录并假设 GNU 工具可用,如果此目录中没有其他文件,您可以使用这个以 null 结尾的管道:

    printf '%s\0' * | sort -zVr | tail -zn+11 | xargs -r0 rm -r -- 
    

    【讨论】:

      【解决方案3】:

      您可以遍历文件并保留一个计数器。它不是单行的,但它应该适合你。

      i=0
      preserve_n=10
      while read -r dir; do
          [ "$i" -ge "$preserve_n" ] && rm -rf "$dir"
          i=$((i + 1))
      done < <(find . -maxdepth 1 -mindepth 1 -type d | sort -r -V)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2015-03-03
        • 2017-07-01
        • 2017-04-21
        • 1970-01-01
        • 2016-02-29
        相关资源
        最近更新 更多