LINUX.ORG.RU

Удаление пустых папок

 , , ,


0

1

Имеется каталог со множеством файлов и папок, необходимо удалить файлы старше 15 дней + следом удалить пустые папки и подпапки. Сделал под это дело два скрипта и засунул в крон. Скрипт №1 отрабатывает, все ок. Но Скрипт №2 удаляет пустые папки только в родительском каталоге, а подпапки нет. Например, если в пустой папке родительского каталога есть еще одна пустая папка, то он ее пропускает. Что нужно указать в команде, чтобы удаление происходило рекурсивно?

Скрипт №1: find /common/«ОбщаяПапка»/ -type f -mtime +15 -exec rm {} ; Скрипт №2: find /common/«ОбщаяПапка»/ -type d -empty -exec rmdir {} ;


Ответ на: комментарий от iljuase

Если запускать снова и снова — да. Но проще изобрести алгоритм, обходящий из глубины.

Используй -delete в find вместо exec, кстати.

Оно медленнее, лучше делать for с find, чем юзать -delete. Ну и rmdir не удаляет непустые диры.

mord0d ★★★★ ()
Ответ на: комментарий от mky

Ваш find экранирует пробелы в именах каталогов?

Причём здесь find? В конструкции с for это не играет совершенно никакой роли, так как выхлоп find будет передан на откуп шеллу.

Чтобы не обосраться с этим, можно делать так:

IFS='
'
mord0d ★★★★ ()
Ответ на: комментарий от mord0d

При том, что связываться с обработкой произвольных имён файлов на sh это вобще последнее дело.

Ну сделаете вы IFS, что будет, если в имени файла будет перевод строки? find его тоже пропустит без экранирования.

Тогда уж сразу пишите print0 у find'а, если такой аргумент существует в вашем мире. http://mywiki.wooledge.org/BashFAQ/020

mky ★★★★★ ()
Ответ на: комментарий от pinus_nigra

А зачем ты даёшь советы по какому-то другому find?

По какому другому? В ОП ни слова о версии/реализации find, даже платформа (ОС) не указана.

mord0d ★★★★ ()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от mky

связываться с обработкой произвольных имён файлов на sh это вобще последнее дело

Ну не знаю, у меня в проде скрипты с обработкой выхлопа из сабшелла в теле циклов стоят, и ни разу с ними проблем не было.

print0 у find’а

Увы, нуль-терминатор иногда отловить вообще невозможно. Даже printf, встроенный в sh в FreeBSD, его высирать не умеет (я с этого в своё время бомбил, но ничего не изменилось).

Bash

Если можно что-то сделать штатными средствами, я предпочитаю делать это без установки дополнительных пакетов (даже если такая возможность имеется, ибо мало ли куда мою скриптоту занесёт в будущем).

mord0d ★★★★ ()