Команда, удаляющая все старые файлы, папки и подпрограммы. -folders

Следующая строка является виновником:

. Script.sh $source

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

Script.sh $source

Или, еще лучше:

"$0" "$source"

Однако надежно получить исходный скрипт во всех случаях довольно сложно. Гораздо лучше использовать функции для рекурсии (в Bash):

function f()
{
   ...
   f different_args
   ...
}

И объявить любые переменные, используемые в f, как local, чтобы они не были изменены рекурсивным вызовом f.

5
25.04.2018, 12:18
2 ответа

Проблема в том, что вы добавили параметр -r в команду rm. Это удалит папки, даже если они не пусты.

Вам нужно сделать это в два этапа:

  1. Удалить только старые файлы:

    найти . -type f -mtime +31 -delete

  2. Чтобы удалить любые старые папки, если они пусты, мы можем заглянуть здесь и немного подправить:

    find . -type d -empty -mtime +31 -delete

4
27.01.2020, 20:41
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 и если он окажется пустым, мы знаем, что ни один элемент (файл/каталог/ссылка/и т.д.) не был новым и, следовательно, этот каталог . безопасен для удаления.

0
27.01.2020, 20:41

Теги

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