脚本删除超过x天但保留某些目录的所有目录

时间:2015-01-22 14:55:06

标签: linux bash ansible

我试图编写一个bash脚本来删除所有目录及其文件但保留某些目录。

drwxr-xr-x 20 ubuntu admin 4096 Jan 21 17:58 .
drwxr-xr-x  8 ubuntu admin 4096 Nov 21 16:45 ..
drwxr-xr-x 11 ubuntu admin 4096 Jan  9 13:09 1763
drwxr-xr-x 11 ubuntu admin 4096 Jan 16 16:46 1817
drwxr-xr-x 11 ubuntu admin 4096 Jan 16 17:39 1821
drwxr-xr-x 11 ubuntu admin 4096 Jan 19 10:15 1823
drwxr-xr-x 11 ubuntu admin 4096 Jan 19 11:57 1826
drwxr-xr-x 11 ubuntu admin 4096 Jan 19 14:55 1827
drwxr-xr-x 11 ubuntu admin 4096 Jan 19 21:34 1828
drwxr-xr-x 11 ubuntu admin 4096 Jan 20 13:29 1833
drwxr-xr-x 11 ubuntu admin 4096 Jan 20 16:13 1834
drwxr-xr-x 11 ubuntu admin 4096 Jan 21 10:06 1838
drwxr-xr-x 11 ubuntu admin 4096 Jan 21 12:51 1842
drwxr-xr-x 11 ubuntu admin 4096 Jan 21 15:20 1845
drwxr-xr-x 11 ubuntu admin 4096 Jan 22 13:00 1848
drwxr-xr-x 11 ubuntu admin 4096 Nov 24 16:34 217
drwxr-xr-x 11 ubuntu admin 4096 Dec  2 20:44 219
drwxr-xr-x 11 ubuntu admin 4096 Dec 15 16:42 221
drwxr-xr-x 11 ubuntu admin 4096 Dec 16 12:04 225
drwxr-xr-x  2 ubuntu admin 4096 Jan 20 16:10 app-conf
lrwxrwxrwx  1 ubuntu admin   19 Jan 21 17:58 latest -> /opt/qudiniapp/1848

在上面的示例中,我们要清除除app-conf文件夹之外的所有非sym链接文件夹。

计划是在部署之前由我的ansible部署脚本触发,这样我们就可以防止我们的服务器填满构建。

3 个答案:

答案 0 :(得分:0)

提供的,所有要删除的目录只包含数字,这可以解决这个问题:

cd /tempdir
rm -rf $(find . -type d -name "[0-9]*" | grep -v "$(readlink latest)")

由于这是一个家政工作,你应该创建一个cronjob,定期删除旧目录。然后,find命令将包括检查,例如,上次修改时间是否超过天数:

rm -rf $(find . -type d -mtime +20 -name "[0-9]*" | grep -v "$(readlink latest)")

答案 1 :(得分:0)

bash脚本:

#!/bin/bash
find /your/path -type d ! \( -path '*app-conf*' -prune  \) -mtime +2 -delete

每个人找到

  

-P切勿关注符号链接。这是默认行为。当find查看或打印文件信息,并且文件是符号链接时,使用的信息应取自符号链接本身的属性。

     

-mtime n文件的数据上次修改时间为n * 24小时前。请参阅-atime的注释,以了解舍入如何影响文件修改时间的解释。

答案 2 :(得分:0)

这是我在Ansible部署中使用的内容,希望它对您有所帮助,因为它几乎完全符合您的需求。

如果在"{{ releases_path }}"目录中有> = 5版本,我总是会删除每个部署中的最旧版本。 "{{ releases_path }}"包含基本上是Git commit hashes(long)的目录

- name: Find oldest release to remove
  shell: '[[ $(find "{{ releases_path | quote }}" -maxdepth 1 -mindepth 1 -type d | wc -l) -ge 6 ]] && IFS= read -r -d $"\0" line < <(find "{{ releases_path | quote }}" -maxdepth 1 -mindepth 1 -type d -printf "%T@ %p\0" 2>/dev/null | sort -z -n); file="${line#* }"; echo "$file";'
  args:
    executable: /bin/bash
    chdir: "{{ releases_path }}"
  register: releasetoremove
  changed_when: "releasetoremove.stdout != ''"

- debug: var=releasetoremove

- name: Remove oldest release
  file: path={{ releasetoremove.stdout }} state=absent
  when: releasetoremove|changed

这是我在发布目录中的每个服务器上始终拥有的(最后5个始终保留):

$ ls -lt | cut -c 28-

  62 Jan 22 17:42 current -> /srv/releases/2a7b80c82fb1dd658a3356fed7bba9718bc50527
4096 Jan 22 17:41 2a7b80c82fb1dd658a3356fed7bba9718bc50527
4096 Jan 22 15:22 73b1252ab4060833e43849e2e32f57fea6c6cd9b
4096 Jan 22 14:47 9df7f1097909aea69916695194ac41938a0c2e9a
4096 Jan 22 14:16 f6a2862d70f7f26ef75b67168a30fb9ef2202555
4096 Jan 22 13:49 fa89eefc5b2505e153b2e59ed02a23889400c4bf