Linux - 仅保存最近的10个文件夹并删除其余文件夹

时间:2011-05-16 22:17:10

标签: linux bash shell

我有一个包含我的应用程序版本的文件夹,每次上传新版本时都会为其创建一个新的子文件夹,子文件夹名称是当前时间戳,这里是使用的主文件夹的打印输出(ls -l | grep ^ d):

drwxrwxr-x 7 root root 4096 2011-03-31 16:18 20110331161649
drwxrwxr-x 7 root root 4096 2011-03-31 16:21 20110331161914
drwxrwxr-x 7 root root 4096 2011-03-31 16:53 20110331165035
drwxrwxr-x 7 root root 4096 2011-03-31 16:59 20110331165712
drwxrwxr-x 7 root root 4096 2011-04-03 20:18 20110403201607
drwxrwxr-x 7 root root 4096 2011-04-03 20:38 20110403203613
drwxrwxr-x 7 root root 4096 2011-04-04 14:39 20110405143725
drwxrwxr-x 7 root root 4096 2011-04-06 15:24 20110406151805
drwxrwxr-x 7 root root 4096 2011-04-06 15:36 20110406153157
drwxrwxr-x 7 root root 4096 2011-04-06 16:02 20110406155913
drwxrwxr-x 7 root root 4096 2011-04-10 21:10 20110410210928
drwxrwxr-x 7 root root 4096 2011-04-10 21:50 20110410214939
drwxrwxr-x 7 root root 4096 2011-04-10 22:15 20110410221414
drwxrwxr-x 7 root root 4096 2011-04-11 22:19 20110411221810
drwxrwxr-x 7 root root 4096 2011-05-01 21:30 20110501212953
drwxrwxr-x 7 root root 4096 2011-05-01 23:02 20110501230121
drwxrwxr-x 7 root root 4096 2011-05-03 21:57 20110503215252
drwxrwxr-x 7 root root 4096 2011-05-06 16:17 20110506161546
drwxrwxr-x 7 root root 4096 2011-05-11 10:00 20110511095709
drwxrwxr-x 7 root root 4096 2011-05-11 10:13 20110511100938
drwxrwxr-x 7 root root 4096 2011-05-12 14:34 20110512143143
drwxrwxr-x 7 root root 4096 2011-05-13 22:13 20110513220824
drwxrwxr-x 7 root root 4096 2011-05-14 22:26 20110514222548
drwxrwxr-x 7 root root 4096 2011-05-14 23:03 20110514230258

我正在寻找一个将留下最后10个版本(子文件夹)并删除其余版本的命令。

有什么想法吗?

6 个答案:

答案 0 :(得分:27)

你去吧。的(编辑)的

ls -dt */ | tail -n +11 | xargs rm -rf

最近修改的第一个列表目录然后将所有这些目录除了前10个,然后将它们发送到rm -rf

答案 1 :(得分:2)

ls -dt1 /path/to/folder/*/ | sed '11,$p' | rm -r 

这假设这些是唯一的目录,工作目录中没有其他目录。

  • ls -dt1通常只打印最新目录,但/*/会 只匹配目录并打印完整路径1确保一个 每场比赛的线/列表t将最新的时间排在最前面。

  • sed将第11行放到底部并仅打印那些行,然后传递给rm

您可以使用xargs,但是为了进行测试,您可能希望删除| rm -r以查看是否首先正确列出了目录。

答案 2 :(得分:2)

如果目录'名称包含除了最后10个具有默认字母排序

的目录之外的所有日期
ls -d */ | head -n -10  | xargs rm -rf

答案 3 :(得分:1)

ls -lt | grep ^d | sed -e '1,10d' |  awk '{sub(/.* /, ""); print }' | xargs rm -rf 

说明:

  • 按时间顺序列出当前目录的所有内容(最新文件优先)
  • 过滤掉所有目录
  • 忽略10个第一行/目录
  • 使用awk从剩余的'ls -l'输出中提取文件名

  • 删除文件

答案 4 :(得分:0)

编辑:

find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf

答案 5 :(得分:-2)

您的目录名称按时间顺序排序,这使这很容易。按时间顺序排列的目录列表仅为*,或[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]更精确。所以你要删除除最后10个之外的所有内容。

set [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
while [ $# -gt 10 ]; do
  rm -rf "$1"
  shift
fi

(当剩下10个以上的目录时,删除最旧的目录。)