rsync удалить старые `--резервные копии -каталоги `, если недостаточно места для создания текущей резервной копии

Немного изменим ваш первый скрипт:

#!/bin/bash

for file in ~/Test/Files/*.xfr
do
    if [ ! -e "$file" ]; then
        echo 'no files were renamed'
        break
    fi

    mv "$file" "${file%.xfr}"
    echo "$file has been renamed" 
done > ~/Test/log.txt

Я сделал здесь две вещи:

  1. Перенаправление в файл журнала будет обрезать файл журнала на каждой итерации, поэтому вместо этого я переместил его в конец done, чтобы он перенаправлял весь стандартный вывод цикла.

  2. Если шаблон не соответствует ни одному имени файла, по умолчанию он останется нераскрытым. Я обнаруживаю это с помощью теста -eи вывожу специальное сообщение. Тогда я breakвыпал из цикла.

Альтернатива:

#!/bin/bash

for file in "$HOME/Test/Files"/*.xfr
do
    if [ -e "$file" ]; then
        mv "$file" "${file%.xfr}"
        printf '%s has been renamed\n' "$file"
    else
        echo 'no files were renamed'
    fi   
done >"$HOME/Test/log.txt"

Здесь я просто немного изменил поток и использовал $HOMEвместо тильды (выглядит лучше в скрипте ИМХО ). Я также использую printfвместо echo, так как это обычно безопаснее для вывода переменных данных (, см., например. " Почему printf лучше, чем echo? " ).

Оба приведенных выше варианта также могут работать с /bin/sh, а не с /bin/bash.

Другой вариант, если вы хотите написать больше «отчета»:

#!/bin/bash

shopt -s nullglob

xfr_files=( "$HOME/Test/Files"/*.xfr )

for file in "${xfr_files[@]}"; do
    mv "$file" "${file%.xfr}"
done

printf '%d files renamed\n' "${#xfr_files[@]}"
if [ "${#xfr_files[@]}" -gt 0 ]; then
    printf '\t%s\n' "${xfr_files[@]}"
fi

Это устанавливает параметр оболочки nullglobв bash, который заставляет шаблоны расширяться до нуля, если нет совпадений. Затем он записывает количество переименованных файлов, и если это число больше нуля, он также перечисляет имена файлов с отступом табуляции.


В обновленном вопросе вы используете переменную PATH. Это переменная, которая содержит путь поиска для утилит оболочки, и установка для нее значения, отличного от списка каталогов с разделителями :-, скорее всего, сделает оболочку неспособной найти mvи другие распространенные инструменты.

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

Дополнительно , тест [ -e $PATH/$file ]должен читаться как [ -e "$file" ], поскольку путь уже включен в значение $file. Это также то, что я использовал в своем коде выше. Не забудьте заключить в двойные -кавычки все раскрытия переменных!

0
07.02.2021, 18:25
1 ответ

Я понятия не имею, как получить размер резервной копии, если только она не создается вашим выходом rsync при пробном -прогоне. Это ниже будет вашим пространством, оставшимся в разделе, в виде числа, которое будет использоваться в переменной для сравнения с вашим желаемым пространством, оставшимся до того, как произойдет удаление. Вы должны выполнить сравнение в своем операторе case для Yy до того, как rsync произойдет на строку выше, выполняя сравнение и удаление, если это необходимо.

root@buster-raspi:~# df -h | grep /dev/sda1
/dev/sda1       200M  117M   83M  59% /boot/firmware
root@buster-raspi:~# df -h | grep /dev/sda1 | cut -d " " -f13
83M
root@buster-raspi:~# df -h | grep /dev/sda1 | cut -d " " -f13 | tr -d M
83

Или в процентах.

root@buster-raspi:~# df -h | grep /dev/sda1 | cut -d " " -f15 | tr -d %
59
0
18.03.2021, 22:32

Теги

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