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


11

(в системе Linux)

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

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

Ответы:


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

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


1
Мне пришло в голову, что это войдет в бесконечный цикл, если у вас нет разрешения на удаление каких-либо пустых каталогов, поэтому, пожалуйста, используйте вместо этого принятый ответ :)
AndrewR

0
for i in `find -type d -empty`; do rmdir $i; done

Близко, но не сигара. Вы пропускаете случай, когда удаление каталога приводит к тому, что его родитель становится пустым.
Саймон Рихтер

Это правда. Я бы findих во второй раз. Никогда не было этого случая в реальной жизни.
ansi_lumen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.