LINUX.ORG.RU

bash. find + удаление файлов = пустые директории.


1

2

всем бодрого.

при помощи find получаю список файлов который «старше» некоторого файла. (-newer)

далее, «скармливаю» этот список некоторому алгоритму, и результат передаю в rm.

проблема в том, что файлы 'find' отыскивает используя ключ '-type f', и как следствие, после удаления файлов иногда остаются пустые директории. использовать 'find -type d' не могу ввиду того, что не всегда нужно удалять все файлы из директории(т.е. всю директорию).

подскажите как разрулить?

благодарен.

★★★

Извини, не совсем понял: что нужно удалять, а что не нужно удалять? Файлы, которые старше заданного и пустые каталоги? Или что? В общем, условия задачи неполны и формулировка неясная.

OldFatMan ()
Ответ на: комментарий от niXman

Мне приходит в голову только двухпроходный алгоритм

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

хм.. кстати вариант. ниже еще порекомендовали ключик -p

вопрос закрыт.

всем благодарен.

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

Тогда в чём проблема? Выше тебе DoctorSinus и YAR уже сказали про rmdir, который удаляет только пустые каталоги. Или тебе ещё нужна проверка: пуст каталог или нет?

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

тебе DoctorSinus и YAR уже сказали про rmdir

да. но что-то я не подумал о столь простом решении. начал алгоритм прорабатывать, и сам себя запутал.

Или тебе ещё нужна проверка: пуст каталог или нет?

нет. если rmdir удаляет только пустые, то ничего лишнего он не удалит.

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

вот dumal тоже, оказывается, как и я, начал думать над алгоритмом :)

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

да. но что-то я не подумал о столь простом решении. начал алгоритм прорабатывать, и сам себя запутал.

Бывает. Иной раз засочиняешься до «чертиков в глазах» :), а задача решается одной командой. По себе знаю.

OldFatMan ()
Ответ на: комментарий от YAR

эм... момент.

'rmdir -p' не удаляет директорию если в ней имеется другая директория, даже и пустая.

поступил так: повторно выполняю 'find' но уже для поиска директорий, и результат передаю в 'rmdir'

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

'rmdir -p' не удаляет директорию если в ней имеется другая директория, даже и пустая.

Да, если есть каталог с подкаталогами a/b/c, то

rmdir -p a

не будет удалять - выдаст ошибку.

Поэтому надо

rmdir -p a/b/c

Собственно, в man-е всё это расписано.

OldFatMan ()
Ответ на: комментарий от niXman

поступил так: повторно выполняю 'find' но уже для поиска директорий, и результат передаю в 'rmdir'

используйте find -delete или find -depth. Это приведёт к тому, что будут удалятся каталоги/файлы начиная с внутренних. Что-то типа (не тестировал!)

find -type f -empty -delete -o -type d -exec rmdir {} \;

Идея в том, что вы обходите дерево ФС начиная с листьев, и там удаляете только листья - пустые файлы (ну или там по -newer), и пустые каталоги. Ваша проблема в том, что при прямом обходе дерева и удалении нелистового узла дерево теряет связаность, и рассыпается, вот вам и не дают порушить структуру. Просто используйте обратный обход.

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

кстати, find -empty работает и с каталогами, это действительно «пусто», а вовсе не нулевая длинна.

drBatty ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.