Автоочистка директории по кол-ву файлов и квоте

Очищает директорию от устарелых файлов, если указанный лимит количества файлов превышен. Также рекурсивно удаляет файлы, если места согласно указанной квоте осталось в 3 раза меньше, чем последний сохраненный файл в этой директории. Если это единственный файл, то выходит не удаляя.
x3 сделано из предположения, что размер следующего файла не будет на много больше предыдущего.
Можно доработать, чтоб переменные принимались как параметры скрипта, но в моем случае это не требуется. Кому понадобится, тот доделает. Это не сложно.
Этот скрипт создавался для создания автоматических бэкапов. Следить за квотами и старыми резервными копиями нет никакого желания и времени.

Актуально для Debian 7, 8

P.S. Если это можно автоматизировать, то это нужно автоматизировать.

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
#!/bin/bash

#######################################################
#                                                     #
#                 control_limits.sh                   #
#                   Author: Skey                      #
#              allmails.oth@gmail.com                 #
#                    2015-11-18                       #
#                                                     #
#         Autoclean directories by limits             #
#######################################################

HOME_DIR=`eval echo ~$USER`
TARGET_DIR="$HOME_DIR/load/"

LIMIT_FILES=7
LIMIT_QUOTA=$((1024*1024*1024*6)) #6Gb

if [ ! -d "$TARGET_DIR" ]; then
    if mkdir -p "$TARGET_DIR"; then
        echo "Created directory: $TARGET_DIR"
    else
        echo "Cannot create directory: $TARGET_DIR"
        exit 1
    fi
fi

control_limit_files() {
    if [ ! -n "$1" ]; then
        echo "Warning: Target directory is undefined"
        return 1
    fi

    if [ ! -n "$2" ]; then
        echo "Warning: Max files is undefined"
        return 1
    fi

    local counter=`ls "$1" | wc -l`
    local cnt

    if [ $counter -gt $2 ]; then # >
        echo "Warning: Limit count file is exceeded"
        cnt=0
        for file in `ls -t "$1"`
        do
            ((cnt++))
            if [ $cnt -gt $2 ]; then # >
                rm -r $1$file
                echo "Removed $1$file"
            fi
        done
    fi

    return 0
}

control_limit_quota() {
    if [ ! -n "$1" ]; then
        echo "Warning: Target directory is undefined"
        return 1
    fi

    if [ ! -n "$2" ]; then
        echo "Warning: Quota is undefined"
        return 1
    fi

    local size_files=`du -sb "$1" | cut -f1`
    if [ $size_files -gt $2 ]; then # >
        echo "Warning: Quota is exceeded ($size_files > $2)"

        if [ `ls "$1" | wc -l` -eq 1 ]; then
            echo "Don't remove last file"
            return 1
        fi

        local first_file=`ls -t $1 | tail -n1`
        rm -r $1$first_file
        echo "Removed $1$first_file"

        control_limit_quota $1 $2
    else 
        local last_file=`ls -t $1 | head -n1`
        local size_last=`du -b $1$last_file | cut -f1`

        if [ $(($size_last*3)) -gt $2 ]; then
            echo "Warning: Not enough space ($(($size_last*3)) > $2)"
			
            if [ `ls "$1" | wc -l` -eq 1 ]; then
                echo "Don't remove last file"
                return 1
            fi

            local first_file=`ls -t $1 | tail -n1`
            rm -r $1$first_file
            echo "Removed $1$first_file"

            control_limit_quota $1 $2
        fi
    fi

    return 0
}

control_limit_files $TARGET_DIR $LIMIT_FILES
control_limit_quota $TARGET_DIR $LIMIT_QUOTA

if [ $? -ne 0 ]; then
    echo "Error quota"
    exit 1
fi

echo "Success"


05 октября 2015 | Рубрика: Linux

Name:*

Feedback:

Message:*

Календарь

  • Сегодня
    17 Марта 2026, Вторник
    ПНВТСРЧТПТСБВС
    1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031

Авторизация