2011-05-16 44 views
7

我有一个包含我的应用程序版本的文件夹,每当我上传新版本时为其创建一个新的子文件夹,子文件夹名称为当前时间戳,这里是所使用的主文件夹的打印输出(ls -l命令| grep的^ d):Linux - 仅保存最近的10个文件夹并删除其余的文件夹

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 201105
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个版本(子文件夹),并删除休息。

有什么想法?

回答

23

你去那里。 (编辑)近日

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

首先列出目录修改,然后采取所有的人,除了第10位,然后将它们发送到rm -rf

+0

即时通讯:rm:无法删除目录:'。' – Ran 2011-05-16 22:27:39

+3

哇!首先,'ls -dt'只输出'.'。其次,如果你将它改正为'ls -t',那么你将删除10个最新的文件,这与所要求的完全相反。第三,如果除了所考虑的目录之外还有其他文件,你的脚本会很乐意删除随机的东西。第四,如果有“奇怪的”文件名,你的脚本可以做任何事情,因为你正在解析'ls'的输出,[不是一个好主意](http://mywiki.wooledge.org/ParsingLs),您将准备好的输入传递给['xargs'](http://linux.die.net/man/1/xargs)。 – Gilles 2011-05-16 22:30:33

+0

等一下我已经注意到,你想先离开第一个10,并删除所有其他人,我认为你需要删除第一个10.嗯你的错误是有趣的。 – 2011-05-16 22:31:18

0

编辑:

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

我觉得应该是:ls -l命令| grep^d | tac | sed -e'1,10d'| xargs rm -rf – Ran 2011-05-16 22:30:42

+1

你正在解析'ls'的输出,[不是一个好主意](http://mywiki.wooledge.org/ParsingLs),并且你将准备好的输入传递给['xargs']( http://linux.die.net/man/1/xargs)。你的'grep^d'没有做你认为它正在做的事 - 如果你有'ls -l',你需要提取文件名(不是一个好主意),但是因为你没有,所以没有目录指示符。 – Gilles 2011-05-16 22:33:28

+0

是的,那是垃圾。我的错。 – linuts 2011-05-16 23:05:13

-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名的目录离开,删除最早的一个。)

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

说明:

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

  • 删除文件

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

这个假定只有这些目录和不其他人出现在工作目录中。

  • ls -dt1通常只打印最新的目录然而/*/将 只匹配目录和打印他们的完整路径的1确保每场比赛一个 线/上市t时间排序在顶部最新。

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

您可以使用xargs的,但测试你可能希望删除| rm -r,看看目录列出正确第一。

1

如果目录名包含日期可以删除所有,但最近10个目录使用默认字母排序

ls -d */ | head -n -10 | xargs rm -rf 
相关问题