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

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

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

  • 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 удаляя те, которые пусты.

  • как удалить последние две строки с разделителями из каждой строки в большом файле
  • Как удалить все из указанного «имени»,
  • journalctl: непризнанная опция '--vacuum-size ='
  • Удаление всех изображений, сделанных с помощью конкретной камеры.
  • Почему `find` не удаляет найденные файлы?
  • Проблемы с правилами udev для запуска сценария bash при отключении жесткого диска
  • Как удалить блок-устройство из списка lsblk на CentOS 7?
  • Найти и удалить файлы, загруженные через Cpanel x минуты назад, используя SSH
  • 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 {} ';' 

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

    Interesting Posts

    Модем последовательного порта загорается, но не может связываться

    Почему Gnome или KDE не производят собственный дистрибутив (или другие проекты для настольных компьютеров, если на то пошло)?

    как прерывать перезагрузку системы?

    Есть ли способ использовать inotify для удаленных файловых систем (в частности, WebDAV)?

    Печать PDF с помощью CUPS

    Arch Linux – make: ошибка при загрузке разделяемых библиотек: libunistring

    Начать sh в указанной директории из inittab

    Загрузка Centos 7 с пользовательской проблемой ядра

    Владелец процесса против пользователя процесса (системный монитор Gnome)

    как я могу профилировать время рендеринга в zsh?

    Комплексное связывание RHEL 5

    как копировать файлы с помощью TTY-файла с одного компьютера на другой, подключенного через ту же домашнюю сеть

    Arch Linux RPI: Насколько точны время на RPi в Linux?

    Grep. Найти несколько шаблонов AND в любом порядке с использованием одного условия

    запустить bash в скрипте

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