Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: помощь со скриптом (удаление старых папок)  (Прочитано 1539 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DimmKo

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Image Hosting
Товарищи, добрый день.
Помогите, пожалуйста, разобрать со скриптом.

Логика такая: формируются каталоги. После формирования должен запускаться процесс очистки старых каталогов, если общее число - более 6 (в качестве примера).

Есть вот такой срипт:
(Нажмите, чтобы показать/скрыть)

Ubuntu Server 20.04.2 LTS | x86_64

Оффлайн БТР

  • Заслуженный пользователь
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6165
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #1 : 02 Декабря 2016, 11:30:15 »
DimmKo, стандартный logrotate для этих целей не подойдёт?

Оффлайн DimmKo

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Image Hosting
Re: помощь со скриптом (удаление старых папок)
« Ответ #2 : 02 Декабря 2016, 11:40:54 »
БТР, я не пробовал его, т.к. не знал, что он есть.
Сейчас почитаю про него и попробую поэкспериментировать.
Спасибо за предложение.
Ubuntu Server 20.04.2 LTS | x86_64

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #3 : 02 Декабря 2016, 11:59:05 »
Код: (bash) [Выделить]
cd $DEL_FLDR 2>&1 > /dev/null #вот жто зачем с такими сложностями и блокировкой всяких сообщений?
if [ "`find . -maxdepth 1 -type d | wc -l`" -gt "$FLDR" ] #зачем нужна проверка,
                                                #+если сразу можно оставить удаляемые?
then
    `find . -maxdepth 1 -type d |  #зачем кавычки «``»?
    grep -e ./ |  #есть опция find -mindepth 1
    tr -d / |  # cлэш абсолютно не мешает удалению,
               #+HO из формата «./имя_папки» (выдает find) получаем «.имя_папки» ???
    tail -n+$FLDR` |
    xargs -i rm -rf '{}' & #почему в фоне? зачем нужно делать через -і (удалять по 1)?
                           #+если есть пробелы будет ошибка
fi
cd - 2>&1 > /dev/null #см. 1 строку.
Код: (bash) [Выделить]
printf "%s\0" "$DEL_FLDR"/*/ | sed "s/\([^\x0]\+\x0\)\{,$FLDR\}//" | xargs -0 rm -rf
Пользователь добавил сообщение 02 Декабря 2016, 12:23:13:
Код: (bash) [Выделить]
printf "%s\0" "$DEL_FLDR"/*/ | cut -d $'\0' -f  1-"$FLDR" --complement | xargs -0 rm -rf
« Последнее редактирование: 02 Декабря 2016, 12:26:41 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн DimmKo

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Image Hosting
Re: помощь со скриптом (удаление старых папок)
« Ответ #4 : 02 Декабря 2016, 12:31:06 »
Azure, спасибо за Ваш ответ.
На вопрос "Почему?..." я отвечу: что по-другому не умею, потому сделал так.
Цитировать
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !
Вот я знаю вот так.

(Нажмите, чтобы показать/скрыть)
Ubuntu Server 20.04.2 LTS | x86_64

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #5 : 02 Декабря 2016, 12:49:44 »
это будет частью другого скрипта и пользователю не надо видеть лишнего в консоли.
cd при нормальном переходе не выдает сообщений, а если вдруг переход не состоялся — так надо останавливать дальнейшее удаление, т.к. удалять будет не там где надо.
оставлять какое-то определенное количество
Так оставляйте: убрали из списка (в данном случае 6 первых) остальное отдали на удаление. Если получилось пусто, то есть удалять нечего, то ничего и не удалится.
не надо ждать
удаление не очень затратная по времени операция (если не делать это по 1 файлу как у Вас в коде), ОС же не стирает файл с диска, это только удаление записи о нем из своей базы данных.
это я не убрал
не пользуйтесь устаревшим форматом «``» когда есть общепринятый «$()»
пробелов в именах нет
Лучше это учесть. Ну а сама причина ошибки тут
из формата «./имя_папки» (выдает find) получаем «.имя_папки»
« Последнее редактирование: 02 Декабря 2016, 12:57:10 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн DimmKo

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Image Hosting
Re: помощь со скриптом (удаление старых папок)
« Ответ #6 : 02 Декабря 2016, 12:57:55 »
cd при нормальном переходе не выдает сообщений,а если переход не состоялся — так надо останавливать дальнейшее удаление, т.к. удалять будет не там где надо.
извините, cd вообще там не будет. Я просто для теста сделал и проверял осуществляется ли переход.

Так оставляйте: убрали из списка (в данном случае 6 первых) остальное отдали на удаление. Если получилось пусто, то есть удалять нечего, то ничего и не удалится.
Я думал что будет вот так: посмотреть кол-во каталогов, если равно или больше - тогда отсортировать от старых к новым (т.е. старые вверху), вычесть необходимо кол-во оставляемых каталогов и старье передать на удаление.

Лучше это учесть. Ну а сама причина ошибки тут
Цитата: Azure от Сегодня в 12:59:05
из формата «./имя_папки» (выдает find) получаем «.имя_папки»
ага, понял. Надо как-то тогда "." убрать))) Буду пробовать.
Спасибо.
Ubuntu Server 20.04.2 LTS | x86_64

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #7 : 02 Декабря 2016, 13:20:54 »
Надо как-то тогда "." убрать))) Буду пробовать.
Чем-то не устроили мои 2 варианта? :o


Пользователь добавил сообщение 02 Декабря 2016, 13:24:03:
тогда отсортировать от старых к новым (т.е. старые вверху)
Где это у Вас в коде или вопросе?
Привыкайте формулировать задачу так: исходные данные, принцип обработки, желаемый результат.
« Последнее редактирование: 02 Декабря 2016, 13:25:58 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн DimmKo

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Image Hosting
Re: помощь со скриптом (удаление старых папок)
« Ответ #8 : 02 Декабря 2016, 13:38:15 »
Чем-то не устроили мои 2 варианта?
Ваши способы я попробую обязательно. Но мне надо разобраться самому. Т.к. скопировать и вставить не очень хорошая перспектива - ничему не научусь в таком случае.

printf - я не знал про такую штуку.
стандартный logrotate для этих целей не подойдёт?
про такую тоже не знал.

Мне была поставлена задача: формируются каталоги, надо оставлять такое-то количество, старье в топку. Пользователь не должен этого видеть и удаляться в фоне.
Я это и пытаюсь сделать.
Ubuntu Server 20.04.2 LTS | x86_64

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #9 : 02 Декабря 2016, 13:50:53 »
Пользователь не должен этого видеть и удаляться в фоне
Если скрипт запускается по расписанию (через крон) то Пользователь его и не увидит.
logrotate подходит 120%, т.к. именно для выполнения подобных задач и предназначен.
Если скрипт, то стоит использовать cd и ls -t | tail | tr '\n' '\0' вместо printf | cut если сортировка по имени не пройдет.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #10 : 02 Декабря 2016, 15:01:45 »
Вот удалит из DIR старые (по дате модификации) папки оставив только 6 самых новых:
find 'DIR' -mindepth 1 -type d -exec stat -c '%Y %n' {} + | sort -rnk1  | cut -d ' ' -f2- | tail -n+7 | xargs -d'\n' rm -vrf &> log.txtи запишет что удалил в лог log.txt

или так:
find 'DIR' -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -nk1 | head -n-6  | cut -d ' ' -f2- | xargs -rt -d'\n' rm -rf &> log.txt
Azure,
Где в ваших варантах определяется дата модификации каталогов?
должен запускаться процесс очистки старых каталогов
« Последнее редактирование: 02 Декабря 2016, 18:22:45 от renzrv »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: помощь со скриптом (удаление старых папок)
« Ответ #11 : 02 Декабря 2016, 16:19:14 »
Где в ваших варантах определяется дата модификации каталогов?
стоит использовать cd и ls -t | tail | tr '\n' '\0' вместо printf | cut
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн DimmKo

  • Автор темы
  • Активист
  • *
  • Сообщений: 260
    • Просмотр профиля
    • Image Hosting
Re: помощь со скриптом (удаление старых папок)
« Ответ #12 : 30 Декабря 2016, 11:45:33 »
Всем спасибо за помощь.

Вот моё решение:
(Нажмите, чтобы показать/скрыть)
Ubuntu Server 20.04.2 LTS | x86_64

 

Страница сгенерирована за 0.051 секунд. Запросов: 23.