Следующая строка является виновником:
. Script.sh $source
Хотя вы могли бы сделать рекурсию таким образом, это затрудняет рассуждения, потому что переменные, изменяемые на следующем уровне рекурсии, изменяются и в вызывающей программе. Вероятно, вы просто хотите вызывать скрипт без использования источника:
Script.sh $source
Или, еще лучше:
"$0" "$source"
Однако надежно получить исходный скрипт во всех случаях довольно сложно. Гораздо лучше использовать функции для рекурсии (в Bash):
function f()
{
...
f different_args
...
}
И объявить любые переменные, используемые в f
, как local
, чтобы они не были изменены рекурсивным вызовом f
.
Проблема в том, что вы добавили параметр -r
в команду rm
. Это удалит папки, даже если они не пусты.
Вам нужно сделать это в два этапа:
Удалить только старые файлы:
найти . -type f -mtime +31 -delete
Чтобы удалить любые старые папки, если они пусты, мы можем заглянуть здесь и немного подправить:
find . -type d -empty -mtime +31 -delete
find . -type d ! -name . -mtime +31 -exec sh -c '
case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
"" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
esac
' {} {} \;
Из текущего каталога запускаем находим
и смотрим только каталоги
, которые не обновлялись с последних 31 дней. И в каждом из этих каталогов мы по очереди погружаемся и ищем все, что не старше 31 дня, и, найдя это, выводим фиктивный символ, а также обрезаем любой поиск вперед (в идеале мы должны просто завершить наш поиск здесь с помощью -quit
, но это не POSIX
, поэтому мы соглашаемся на -prune
).
Затем мы ищем результат этой операции find
и если он окажется пустым, мы знаем, что ни один элемент (файл/каталог/ссылка/и т.д.) не был новым и, следовательно, этот каталог . безопасен для удаления.