Удалите самые старые файлы на 50 ГБ в busybox, когда используемая способность достигнет 95%

Если Ваше системное время / дата вернулось до 1 января 1970 или что-то древнее как этот затем Ваши компьютеры, вся инфраструктура SSL будет временно повреждена.

Соединение с репозиториями программного обеспечения обычно делается по соединению SSL в эти дни, чтобы препятствовать тому, чтобы кто-то делал нападение прерывания man-in-the-middle.

Просто установите свою системную дату, чтобы быть корректными, и загружающее и обновляющее программное обеспечение волшебно продолжит работать.

3
30.10.2016, 18:36
2 ответа

Так как busybox реализация находки не предлагает пользовательское выходное форматирование, необходимо произвести задачу форматирования на стороне к отдельной программе :) К счастью, даже busybox включает удобное stat команда. Это - поля выходного формата, отличаются от тех, что GNU находит использование, таким образом, символы, которые необходимо использовать, отличаются. Сценарий ниже принимает это find и stat те, которые происходят из busybox.

DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"

find $DIRS -type f -exec stat -c "%Y %s %n" {} \; | sort -r -n | while read time bytes filename
do
    rm -fv "$filename"
    DELBYTES=$((DELBYTES + bytes))

    if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done

Как всегда, прочитайте описание каждой команды перед использованием его. В случае busybox, Вы не найдете страницы справочника для них, но можно использовать --help отобразить информацию об использовании.

Предупредите, что это решение может повредить вещи в маловероятной ситуации, когда имена файлов содержат символы новой строки в них! Это не должно происходить в здоровой системе, но могло бы произойти, например, если кому-то удается или ворваться в систему или использовать некоторую уязвимость, которая позволяет произвольное создание файла.

Для предотвращения случайно удаляющих полезных файлов в таких случаях необходимо сначала найти и удалить все файлы, которые включают новые строки в их имена. Для списка их работайте:

find / -name "*
*"

(Между звездочками существует только новая строка.) Затем когда Вы уверены, все те файлы не нужны, удаляют их использующий также

find / -name "*
*" -delete

или

find / -name "*
*" -print0 | xargs -0 rm -vf

Оба должны работать с busybox.

5
27.01.2020, 21:13
  • 1
    Большое спасибо. Это также удаляет папки в том каталоге? или только файлы? Я получаю следующую ошибку: code: найдите: статистика: Никакой такой файл или каталог - таким образом, это означает это, не останавливается со статистикой. Или это означает, что мой HD не полон для 95% –  Jasper 23.08.2012, 22:16
  • 2
    @Jasper, Который означает, что Ваш Busybox не включает stat утилита. Busybox является очень настраиваемым, много функций являются дополнительными. А-ч –  Gilles 'SO- stop being evil' 23.08.2012, 22:27
  • 3
    черт возьми! Это для "OpenElec" сборки Linux. Легкая версия XBMC (медиацентр). Я предполагаю, что единственное решение состоит в том, чтобы спросить, могут ли они добавить поддержку stat в будущем выпуске? Или я могу добавить это сам? –  Jasper 23.08.2012, 22:51
  • 4
    WOW, которое было быстро. Они добавили его в следующем выпуске: github.com/OpenELEC/OpenELEC.tv/commit / … сообщит Вам, когда я протестировал этот сценарий в следующей бета-версии от Openelec.. –  Jasper 23.08.2012, 23:50

Обычно это - плохая идея проанализировать вывод ls. Но во встроенной системе, которая имеет нет stat, никакой zsh, нет find -printf, никакой жемчуг или другой большой язык сценариев, это - единственный способ отсортировать файлы по дате. Предположение, что имена файлов не содержат пробела и ни одного из \'" (который xargs искажения) — предположение, что Ваш исходный сценарий делает — можно использовать xargs ls -str к дисплейным файлам, отсортированным по дате, и дисплей их размер в процессе.

find $DIRS -type f |
xargs ls -str |
while read kilobytes filename; do …

Обратите внимание, что размер отображен в килобайтах вместо байтов. Кроме того, это - дисковое место, занятое файлом, а не числом байтов в файле. Обычно, это число является размером файла, окруженным к следующему целому числу блоков, но это может быть меньше, если файл редок. В сценарии, который освобождает дисковое пространство, это, вероятно, что Вы хотите.

Существует большой протест со сценарием выше: это только распечатает свои результаты в правильном порядке, если количество файлов будет достаточно небольшим это xargs может выполнить единственный вызов к ls. Если существуют множественные вызовы ls, каждый вызов отсортирует свои аргументы отдельно. Можно распечатать даты файла с ls, но сортировка этого человекочитаемого вывода очень сложна. Лучшее решение, по крайней мере, обнаружить ошибочный случай состоит в том, чтобы заменить выводом find в командную строку.

{ set -f; IFS='
'; ls -str $(find $DIRS -type f); } |
while read -r kilobytes filename; do …
2
27.01.2020, 21:13

Теги

Похожие вопросы