1

У меня есть резервный скрипт, который запускается раз в день. Резервные копии сохраняются в папке под папкой в подпапке с именем date ($(date +"%F")).

Другой скрипт для очистки предназначен для запуска раз в неделю. Я хочу, чтобы этот скрипт сохранял последние 10 резервных копий и удалял все остальные.

В настоящее время я просто удаляю все старше 10 дней, вызывая find $PWD -type d -ctime +10 -exec rm -rf {} + . Но это может разрушить все резервные копии, если за последние 10 дней не было никаких резервных копий из-за ошибок, которые не были реализованы (что не должно, но может случиться).

Если в сценарии количество доступных резервных копий будет равно 10 или более, ничего (это) опасного не произойдет.

Так как сохранить только самые новые подпапки х и удалить все остальные

1 ответ1

1

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

ls -d */ | head -n-10 | xargs rm -rf

Принимая вышеуказанную команду по одной штуке за раз:

  • ls -d */ выводит подкаталоги в алфавитном порядке. Поскольку ваши подкаталоги названы по дате с помощью $(date +"%F") , это то же самое, что перечисление от самого старого до самого нового.

  • head -n-10 печатает все, кроме последних десяти строк. Таким образом, это печатает все, кроме десяти самых последних подкаталогов.

  • Команда xargs rm -rf удалит все имена файлов, полученные из head -n-10 .

При тестировании этого вы можете попробовать:

ls -d */ | head -n-10 | xargs echo rm -rf

Это покажет вам , что команда rm будет выполняться без фактического выполнения его.

Вышеприведенное не будет работать с подкаталогами, в именах которых есть пробелы, табуляции или новые строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .