我有一个自动部署脚本,它将 git 提交到某个分支,编译并将存档的二进制对象上传到云 (S3)。稍后,该脚本登录到 EC2 实例并下载存档并执行/启动项目/服务器。
到目前为止,一切都运行正常。最近,我遇到了磁盘空间问题。由于我还存储日志并维护当前/以前的工作提交,因此我的目录结构如下:
/path
/current/ <- symlink
/prev/ <- symlink
/HASH00001/
/HASH00002/
/HASH00003/
/HASH00004/
/HASH00005/
/.../
/.../
/HASH0000n/
/some.log
/some.log.1
/some.log.2.gz
/...
为了维护,我想删除特定 git 提交的 SHA 值所在的所有子目录。但需要注意的是,不应删除和符号链接/path
指向的目录。current
prev
到目前为止,我都是在遇到存储问题的任何机器上手动执行此操作。我希望我的部署脚本也能处理此步骤。
我正在使用ls
命令并根据上次访问时间戳对结果进行排序:
ls -drt | head -n -4
并xargs rm -rf
通过管道传送。
我现在正在考虑修改它,以便只列出长度恰好 40 个字符的目录名称,然后删除符号链接到的目录current
和prev
。
能否给我一些指点,告诉我如何实现同样的目标!
答案1
这应该列出目录下所有长度为 40 个字符的文件夹,PATH
但不包括指向的文件夹current
和prev
符号链接
cd PATH
find . -type d -name '????????????????????????????????????????' ! -name $(readlink current) ! -name $(readlink prev) -prune
然后,-delete
如果您find
支持它,或者通过管道xargs rm -rf
注意:图案应为 40
?
。