Как удалить все пустые папки
Перейти к содержимому

Как удалить все пустые папки

  • автор:

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

Задача — удалить пустые папки. Код внизу удаляет только последнюю папку и отключается. Но, после удаления последней папки, папка, в которой она находилась тоже становится пустой. Как заставить скрипт после удаления последней папки проверять ту папку, из которой он удалил последнюю и удалял ее?

def del_empty_dirs(path): for d in os.listdir(path): a = os.path.join(path, d) if os.path.isdir(a): if not os.listdir(a): os.rmdir(a) print(a, 'удалена') else: del_empty_dirs(a) 

Отслеживать
задан 13 мар 2017 в 14:06
43 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вам нужен поиск в глубину..
Сначала углубляемся в рекурсию, только потом что-то проверяем/удаляем:

def del_empty_dirs(path): for d in os.listdir(path): a = os.path.join(path, d) if os.path.isdir(a): del_empty_dirs(a) if not os.listdir(a): os.rmdir(a) print(a, 'удалена') 

Таким образом, мы гарантируем, что по выходу из рекурсивного вызова — все дочерние папки уже обработаны.

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

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

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

grraf
11.03.21 08:06:41 MSK

Как удалить пустые папки?

Добрый день.
Имеется каталог со множеством файлов и папок, необходимо удалить файлы старше 15 дней + следом удалить пустые папки и подпапки. ьСделал под это дело два скрипта и засунул в крон.
Скрипт №1 отрабатывает, все ок.
Но Скрипт №2 удаляет пустые папки только в родительском каталоге, а подпапки нет. Например, если в пустой папке родительского каталога есть еще одна пустая папка, то он ее пропускает.
Что нужно указать в команде, чтобы удаление происходило рекурсивно?
если хочу посмотреть порно я выбираю лучшее здесь https://bestfreepornsites.pro
Скрипт №1: find /common/«ОбщаяПапка»/ -type f -mtime +15 -exec rm <> ;
Скрипт №2: find /common/«ОбщаяПапка»/ -type d -empty -exec rmdir <> ;

  • Вопрос задан более трёх лет назад
  • 820 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 4

Rsa97

Для правильного вопроса надо знать половину ответа

# man find . -depth Always true. Causes descent of the directory hierarchy to be done so that all entries in a directory are acted on before the directory itself.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

Например, если в пустой папке родительского каталога есть еще одна пустая папка, то он ее пропускает.

Если в родительском каталоге есть каталог, даже пустой, то родительский каталог не пуст.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
никого не трогаю, починяю примус
зачем два скрипта , если можно в одну строку все сделать..
-exec rm -rf <> \;
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Сфера интересов: Opensource, Linux, SQl, Python.

rmdir надо запустить с ключом -p, тогда он удаляет все родительские пустые каталоги, как-то так:
Скрипт №2: find /common/«ОбщаяПапка»/ -type d -empty -exec rmdir -p <> ;

Как найти и удалить все вложенные пустые папки на PHP

Рассмотрим способ как найти и удалить все вложенные пустые директории на PHP без специальных библиотек (рекурсивно).

Для этого нам понадобится функция, которую будет вызывать рекурсивно для все внутренних каталогов. В комментариях как всегда указал каждый шаг:

function removeEmptyFolders($path) < $isFolderEmpty = true; // по умолчание ставим, что текущий раздел пустой if(substr($path, -1) == "/") // смотрим последний символ пути $pathForGlob = $path . "*"; // добавим "*" в конце else $pathForGlob = $path . DIRECTORY_SEPARATOR . "*"; // добавим "/*" в конце // смотрим что есть внутри раздела foreach (glob($pathForGlob) as $file) < if (is_dir($file)) // если это раздел < // рекурсивно запускаем нашу функцию еще if (!removeEmptyFolders($file)) $isFolderEmpty = false; >else // если этой файл < // значит раздел не пустой $isFolderEmpty = false; >> // если раздел в итоге пустой, удаляем его if ($isFolderEmpty) rmdir($path); // возвращаем значение return $isFolderEmpty; >

DIRECTORY_SEPARATOR — это спец.константа, которая определяет разделители в пути файлов (тип слеша)

Далее просто вызываем её для нужного нам абсолютного пути, например:

removeEmptyFolders("/home/bitrix/to-delete/");

И радуемся результату

Для информации: функция rmdir не удаляет папки, если в них есть файлы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *