Рекурсивная очистка всех папок и подпапок в папке, в которой нет файлов

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

Поэтому, если я начну с этого:

  • mainFolder
    • folder1
      • folder1 (пустой)
      • folder2
        • file.txt
      • folder3 (пусто)
    • folder2
      • folder1 (пустой)
      • folder2 (пустой)
      • folder3
        • folder1
          • folder1 (пустой)
    • folder3
      • folder1
        • file.txt

Я должен закончить с этим:

  • mainFolder
    • folder1
      • folder2
        • file.txt
    • folder3
      • folder1
        • file.txt

Так:

  • /mainFolder/folder1/folder1 был удален, потому что у него не было файлов
  • /mainFolder/folder1/folder3 был удален, потому что у него не было файлов
  • /mainFolder/folder2 был удален, потому что у него не было файлов, даже все подпапки были пустыми

Я надеюсь в этом есть смысл…

Единственная идея, которая у меня была, заключалась в том, чтобы начать с mainFolder и рекурсивно перемещаться по каждой mainFolder удаляя те, которые пусты.

  • Как проверить, можно ли удалить библиотеку?
  • Как удалить все из указанного «имени»,
  • Удаление всех изображений, сделанных с помощью конкретной камеры.
  • Почему `find` не удаляет найденные файлы?
  • Проблемы с правилами udev для запуска сценария bash при отключении жесткого диска
  • journalctl: непризнанная опция '--vacuum-size ='
  • как удалить последние две строки с разделителями из каждой строки в большом файле
  • Как удалить блок-устройство из списка lsblk на CentOS 7?
  • 3 Solutions collect form web for “Рекурсивная очистка всех папок и подпапок в папке, в которой нет файлов”

    Посмотрите, делает ли это то, что вы хотите:

     find mainFolder -depth -empty -type d -exec rmdir {} \; 

    Это должно найти каталоги в mainFolder используя mainFolder глубины, которые пусты, и удалите эти каталоги. Поскольку он выполняет обход глубины, так как он удаляет подкаталоги, если родительский каталог становится пустым, find определит его как пустое и удалит его.

    Решение

    Вероятно, есть несколько сочетаний коммутаторов, чтобы find это, но я думаю, что подход Python проще (и он кросс-платформенный, а не тот, который вам нужен):

     import os top = './mainFolder' for root, dirs, files in os.walk(top, topdown=False): for name in dirs: dir_path = os.path.join(root, name) if not os.listdir(dir_path): # An empty list is False os.rmdir(os.path.join(root, name)) 

    Настройка и тесты

    Создать каталог файлов

     # https://stackoverflow.com/a/246128/295807 readonly script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd "$script_dir" rm -rf mainFolder mkdir -p mainFolder/{folder1/{folder1,folder2,folder3},folder2/{folder1,folder2,folder3/folder1/folder1},folder3/folder1} touch mainFolder/folder1/folder2/file.txt touch mainFolder/folder3/folder1/file.txt 

    Контрольная работа:

     $ tree mainFolder/ mainFolder/ ├── folder1 │  ├── folder1 │  ├── folder2 │  │  └── file.txt │  └── folder3 ├── folder2 │  ├── folder1 │  ├── folder2 │  └── folder3 │  └── folder1 │  └── folder1 └── folder3 └── folder1 └── file.txt 12 directories, 2 files 

    Запустите скрипт Python:

     python work.py 

    Контрольная работа:

     $ tree mainFolder/ mainFolder/ ├── folder1 │  └── folder2 │  └── file.txt └── folder3 └── folder1 └── file.txt 4 directories, 2 files 

    Примечание. Если файл добавляется в папку после того, как Python проверяет, является ли он пустым, но до его фактического удаления, Python вызовет исключение! На практике это не имеет большого значения, потому что время между этими двумя шагами измеряется в микросекундах, но это то, о чем нужно знать.

    Используя реализацию find которая поддерживает как -delete и -empty :

     find mainFolder -type d -empty -delete 

    Это сделает обход глубины структуры каталогов, основанной на mainFolder и удалит все пустые каталоги.

    Использование стандартной find :

     find mainFolder -depth -type d -exec sh -c 'rmdir "$1" 2>/dev/null' sh {} ';' 

    Это будет пытаться использовать rmdir для каждого каталога в mainFolder при обходе структуры в глубину. Поскольку rmdir не может удалить непустые каталоги, будут удалены только пустые. Ошибки из rmdir отбрасываются.

    Чтобы явно проверить каждый каталог перед запуском rmdir над ним:

     find mainFolder -depth -type d -exec sh -c 'd="$1"; set -- "$d"/*; [ ! -e "$1" ] && rmdir "$d"' sh {} ';' 

    Это предполагает, что в каталогах нет скрытых файлов.

    Linux и Unix - лучшая ОС в мире.