Wie lösche ich alle leeren Verzeichnisse?

11

(auf einem Linux-System)

Ich habe eine große Anzahl verschachtelter Unterverzeichnisse in einem Dateisystem. Ich möchte alle Verzeichnispfade bereinigen, die überhaupt keine Dateien enthalten.

Mit anderen Worten, ich möchte jedes Verzeichnis, in dem sich keine Dateien in diesem Verzeichnis oder in einem Unterverzeichnis dieses Verzeichnisses befinden, rekursiv löschen.

AndrewR
quelle

Antworten:

15

Für alle Versionen von find

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

Wenn Sie eine neuere Version haben

 find -type d -empty -delete
Mike
quelle
cool, kannte die -deleteFlagge nicht.
ansi_lumen
Ich auch nicht. Ich habe etwas Neues gelernt. Ich habe bereits Skripte geschrieben und mithilfe der Rekursion leere Verzeichnisse gefunden. Dies vereinfacht diese Aufgabe erheblich.
James
2
ya die -leere Flagge hilft hier wirklich. Es funktioniert auch, um leere Dateien zu finden, wenn Sie den Typ d nicht angegeben oder nur den Typ f verwendet haben
Mike
1

Möglicherweise nicht die beste Lösung, aber dieses Skript funktioniert:

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

(teilweise basierend auf der Antwort auf Alle leeren Ordner auflisten )

AndrewR
quelle
1
Mir ist gerade eingefallen, dass dies in eine Endlosschleife geht, wenn Sie keine Berechtigung zum Entfernen eines der leeren Verzeichnisse haben. Verwenden Sie stattdessen die akzeptierte Antwort :)
AndrewR
0
for i in `find -type d -empty`; do rmdir $i; done
ansi_lumen
quelle
Nah dran, aber keine Zigarre. Sie vermissen den Fall, dass das Entfernen eines Verzeichnisses dazu führt, dass das übergeordnete Verzeichnis leer wird.
Simon Richter
Das ist richtig. Ich würde findsie in einem zweiten Lauf. Ich hatte diesen Fall noch nie im wirklichen Leben.
ansi_lumen