Jak usunąć wszystkie puste katalogi

11

(w systemie Linux)

Mam duży zestaw zagnieżdżonych podkatalogów w systemie plików. Chciałbym przyciąć wszystkie ścieżki do katalogów, które w ogóle nie zawierają plików.

Innymi słowy, chciałbym usunąć każdy katalog, w którym nie ma plików w tym katalogu lub w żadnym podkatalogu tego katalogu rekurencyjnie.

AndrewR
źródło

Odpowiedzi:

15

Dla wszystkich wersji find

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

Jeśli masz nowszą wersję

 find -type d -empty -delete
Mikrofon
źródło
fajnie, nie znałem -deleteflagi.
ansi_lumen
Ja też nie. Nauczyłem się czegoś nowego. Pisałem wcześniej skrypty, używając rekurencji do znajdowania pustych katalogów. To znacznie upraszcza to zadanie.
James
2
tak, flaga -ppty naprawdę tu pomaga. Działa również w celu znalezienia pustych plików, jeśli nie podałeś -type d lub po prostu użyłeś -type f
Mike
1

Może nie być najlepszym rozwiązaniem, ale ten skrypt działa:

#!/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

(częściowo oparty na odpowiedzi na listę wszystkich pustych folderów )

AndrewR
źródło
1
Właśnie przyszło mi do głowy, że przejdzie to w nieskończoną pętlę, jeśli nie masz uprawnień do usunięcia któregoś z pustych katalogów, więc zamiast tego skorzystaj z przyjętej odpowiedzi :)
AndrewR
0
for i in `find -type d -empty`; do rmdir $i; done
ansi_lumen
źródło
Zamknij, ale nie cygaro. Brakuje przypadku, w którym usunięcie katalogu powoduje, że jego rodzic staje się pusty.
Simon Richter
To prawda. Zrobiłbym findje za drugim razem. Nigdy nie miałem tego przypadku na żywo.
ansi_lumen