Скрипт очистки каталога Linux

Мне нужно написать скрипт для веб-сервера, который очистит файлы/папки старше 14 дней, но сохранит последние 7 файлов/каталогов. До сих пор я проводил свои исследования, и вот что я придумал (я знаю, что синтаксис и команды неверны, но просто чтобы вы поняли):

ls -ldt /data/deployments/product/website.com/*/ | tail -n +8 | xargs find /data/deployments/product/website.com/ -type f -type d -mtime +14 -exec rm -R {} \;

Это мой мыслительный процесс о том, как должен вести себя скрипт (я больше работаю с пакетами Windows):

Список содержимого каталога

 If contents is less than or equal to 7, goto END
 If contents is > 7 goto CLEAN
:CLEAN
ls -ldt /data/deployments/product/website.com/*/
keep last 7 entries (tail -n +8)
output of that "tail" -> find -type f -type d (both files and directories) -mtime +14 (not older than 14 days) -exec rm -R (delete)

Я видел кучу примеров с использованием xargs и sed, но я просто не могу понять, как собрать все это вместе.


person RenatoG    schedule 21.08.2012    source источник
comment
Что определяет, какие 7 сохраненных файлов?   -  person kojiro    schedule 22.08.2012
comment
Вам, вероятно, следует взглянуть на logrotate.   -  person Lev Levitsky    schedule 22.08.2012
comment
удалить файлы/папки старше 14 дней, но сохранить последние 7 файлов/каталогов. Означает ли это: сохранить файл, если его возраст меньше 14 дней ИЛИ если это один из 7 последних файлов в каталоге?   -  person leonbloy    schedule 22.08.2012
comment
Это означает, что в указанном месте должно быть как минимум 7 каталогов. Если их больше 7, вычистить самые старые, до 14 дней.   -  person RenatoG    schedule 25.08.2012


Ответы (1)


#!/bin/bash

find you_dir -mindepth 1 -maxdepth 1 -printf "%T@ %p\n" | \
sort -nrk1,1 |sed '1,7d' | cut -d' ' -f2 | \
xargs -n1 -I fname \
find fname -maxdepth 0 -mtime +14 -exec echo rm -rf {} \;

удалите echo, если вы довольны результатом...

Объяснение (построчно):

  1. find точно в your_dir и вывести секунды_с_Unix_epoch (%T@) и имя файла (/каталога) для каждого файла/каталога в отдельной строке
  2. сортировать по первому полю (seconds_since_Unix_epoch) по убыванию, отбросить первые семь строк - из остальных извлечь только имя (второе поле)
  3. xargs переходит к новому процессу find аргумент за аргументом (-n1) и использует fname для представления аргумента
  4. -maxdepth 0 ограничивает find только fname

Вы можете сохранить minNrOfFiles и ageLimit в Bash-Variables или передать скрипт с несколькими изменениями:

minNrOfFiles=7 # or $1
ageLimit=14    # or $2

изменить: sed '1,'"$minNrOfFiles"'d' и -mtime +"$ageLimit"

person Theodros Zelleke    schedule 21.08.2012
comment
Спасибо за ваш сценарий. Однако он не покидает 7 каталогов. Я не буду удалять все, но я не хочу, чтобы он удалял то, что не должен. Например, текущий каталог, в котором я запускаю скрипт, содержит 5 файлов и 5 каталогов. Когда я запускаю ваш скрипт, он дает мне 3 папки, которым действительно больше 14 дней. Однако общее количество папок меньше 7, поэтому скрипт не должен ничего удалять. Пожалуйста, порекомендуйте. Спасибо - person RenatoG; 25.08.2012
comment
пожалуйста, прочитайте свой собственный вопрос: в нем говорится ... сохранить последние 7 файлов/каталогов .... И это именно то, о чем вы сообщаете: у вас есть 5 файлов + 5 каталогов (= 10 объектов) и скрипт удаляет 3 самых старых, старше 14 дней (оставляя 7) - person Theodros Zelleke; 25.08.2012
comment
Ага, понятно. Каталоги в этом пути являются результатом файлов tar.gz, поэтому мне нужно запустить два отдельных сценария: один сценарий для обработки каталогов и один сценарий для обработки файлов. Как я могу отредактировать этот скрипт, чтобы сделать это? Спасибо! - person RenatoG; 27.08.2012