- 不确定这是属于这里还是属于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步骤?
答案 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