LINUX.ORG.RU

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

 , , ,


1

1

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

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


Пустые мамки удаляются так:

for d in $(find "/ОбщаяМамка/" -mindepth 1 -maxdepth 1 -type d -print); do
	[ "x$(ls "${d}")" = "x" ] \
		&& rmdir "${d}"
done

Вложенность изобретай сам, вариантов множество.

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

Нужно обходить диры с наибольшей глубины вложенности в наименьшую, иначе при удалении пустых дир в дирах с пустыми дирами, опустевшие диры останутся.

mord0d ★★★★★
()

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

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

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

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

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

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

Оно медленнее, лучше делать for с find, чем юзать -delete.

Бенчил?

На >=10K мелких файлов оно даже на глаз заметно.

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

       Global options
              Global  options affect the operation of tests and actions speci‐
              fied on any part of the command line.  Global options always re‐
              turn  true.   The  -depth option for example makes find traverse
              the file system in a depth-first order.
slowpony ★★★★★
()
Ответ на: комментарий от kardjoe

Зачем спрашиваешь? Попробуй! Я не знаю что и как у тебя там, ты даже версии софта не огласил (да и не скажут они мне ничего).

mord0d ★★★★★
()
find /path/to/dir -type d -empty -delete
darktic ★★★
()
Ответ на: комментарий от Twissel

Э-эх, жаль не зря Царя скастовать)

Зачем нам царь, если у нас с вами есть Делириум …

Владимир 123

anonymous
()
Ответ на: комментарий от Twissel

Витя чувак крутой

Завтра мы с вами идем к нему в гости, не забудьте. Будем жарить кабачок и смотреть dvd.

Владимир 123

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

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

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

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

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

А зачем ты даёшь советы по какому-то другому find? Вон в винде find ещё более другой, можно о его ключах подискутировать.

pinus_nigra
()
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.