Немного изменим ваш первый скрипт:
#!/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
Я сделал здесь две вещи:
Перенаправление в файл журнала будет обрезать файл журнала на каждой итерации, поэтому вместо этого я переместил его в конец done
, чтобы он перенаправлял весь стандартный вывод цикла.
Если шаблон не соответствует ни одному имени файла, по умолчанию он останется нераскрытым. Я обнаруживаю это с помощью теста -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
. Это также то, что я использовал в своем коде выше. Не забудьте заключить в двойные -кавычки все раскрытия переменных!
Я понятия не имею, как получить размер резервной копии, если только она не создается вашим выходом 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