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

11

(в системе Linux)

У меня есть большой набор вложенных подкаталогов в файловой системе. Я хотел бы удалить все пути к каталогам, которые вообще не содержат файлов.

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

AndrewR
источник

Ответы:

15

Для всех версий найти

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

Если у вас есть более новая версия

 find -type d -empty -delete
Майк
источник
круто, не знал -deleteфлаг.
ansi_lumen
И я нет. Я узнал что-то новое. Я уже писал сценарии, используя рекурсию для поиска пустых каталогов. Это значительно упрощает эту задачу.
Джеймс
2
Да, флаг -impty действительно помогает здесь. Он также работает для поиска пустых файлов, если вы не включили -type d или просто использовали -type f
Майк
1

Возможно, не лучшее решение, но этот скрипт работает:

#!/bin/sh

while true
do
    DIRS=`find . -xdev -type d -exec find {}  -maxdepth 0 -empty  \;`
    if [ -z "$DIRS" ]; then
        exit 0
    else
        echo $DIRS | xargs rmdir
    fi
done

(частично основываясь на ответе на Список всех пустых папок )

AndrewR
источник
1
Мне пришло в голову, что это войдет в бесконечный цикл, если у вас нет разрешения на удаление каких-либо пустых каталогов, поэтому, пожалуйста, используйте вместо этого принятый ответ :)
AndrewR
0
for i in `find -type d -empty`; do rmdir $i; done
ansi_lumen
источник
Близко, но не сигара. Вы пропускаете случай, когда удаление каталога приводит к тому, что его родитель становится пустым.
Саймон Рихтер
Это правда. Я бы findих во второй раз. Никогда не было этого случая в реальной жизни.
ansi_lumen