使用shell脚本和find命令删除除最后5个目录之外的所有目录

时间:2010-07-01 11:22:28

标签: linux deployment shell find

- 不确定这是属于这里还是属于serverfault -

我想要做的是列出目录中的所有目录并删除所有目录,除了最后一个目录5.我们有一个部署系统,它会逐步做一些链接:

/var/www/html/build1
/var/www/html/build2
/var/www/html/build3
/var/www/html/build4
/var/www/html/build5
/var/www/html/build6
/var/www/html/build7
/var/www/html/build8
/var/www/html/build9
/var/www/html/build10

这耗费了太多的磁盘空间,所以我们只想保留最后5个版本。

我想出了以下内容:

(找/ var / www / html / -type d -name“build *”| sort -r) 在/ var / www / html等/ build1564 在/ var / www / html等/ build1563 在/ var / www / html等/ build1560 在/ var / www / html等/ build1558 在/ var / www / html等/ build1557 在/ var / www / html等/ build1556 在/ var / www / html等/ build1555 在/ var / www / html等/ build1554 在/ var / www / html等/ build1553 在/ var / www / html等/ build1552 在/ var / www / html等/ build1551 的/ var / www / html等/ build1550

现在我需要做的就是为该命令添加一个“offset”,这样前五个目录就不会出现了。之后,应删除其余目录。

如果目录不超过5个,则不会发生任何事情。

我想我在这里仍然缺少两步,偏移步骤和rm -rf步骤?

2 个答案:

答案 0 :(得分:4)

要获得除了第5个之外的所有内容,请使用tail -n +5。(我认为您不需要反转排序) 对于它们你可以使用xargs。 所以你可以试试这个

  

找到/ var / www / html / -type d -name“build *”|排序|尾巴-n +5 | xargs -I%echo -rf%

(用rm替换echo来做)

答案 1 :(得分:3)

您无法使用sort,因为它无法识别build10 > build9。您必须手动切断前缀:

for dir in build*
do
    echo "${dir#build}"
done | sort -n | head -n -5 | xargs -I '%' echo -r 'build%'

以下示例显示原始代码失败的位置:

/tmp $ mkdir build8 build9 build10
/tmp $ find . -type d -name "build*" | sort -r
./build9
./build8
./build10