it-swarm.com.de

Wie kann ich leere Verzeichnisse in meinem Home-Verzeichnis rekursiv löschen?

Mögliches Duplikat:
Wie entferne ich alle leeren Verzeichnisse in einem Teilbaum?

Ich erstelle sehr oft Verzeichnisse, die über mein Home-Verzeichnis verstreut sind, und es fällt mir sehr schwer, sie zu finden und zu löschen.

Ich möchte, dass jeder Alias ​​/ jede Funktion/jedes Skript alle leeren Verzeichnisse in meinem Ausgangsverzeichnis findet/findet und löscht.

158
Santosh Kumar

Der Befehl find ist das Hauptwerkzeug für rekursive Dateisystemoperationen. Verwenden Sie die -type d Ausdruck, um find mitzuteilen, dass Sie nur Verzeichnisse suchen möchten (und keine einfachen Dateien). Die Version GNU von find unterstützt das -empty test, also

$ find . -type d -empty -print

druckt alle leeren Verzeichnisse unter Ihrem aktuellen Verzeichnis.

Verwenden find ~ -… oder find "$HOME" -…, um die Suche auf Ihr Home-Verzeichnis zu stützen (wenn es nicht Ihr aktuelles Verzeichnis ist).

Nachdem Sie überprüft haben, dass dies die richtigen Verzeichnisse auswählt, verwenden Sie -delete um alle Übereinstimmungen zu löschen:

$ find . -type d -empty -delete
310
Baldrick

Sie können rmdir für jedes Verzeichnis aufrufen, da rmdir ein Verzeichnis nur löscht, wenn es leer ist:

find "$HOME" -type d -exec rmdir {} + 2>/dev/null

Wenn Sie auch die zu entfernenden Verzeichnisse drucken möchten, müssen Sie überprüfen, ob sie leer sind:

find "$HOME" -type d -exec bash -c 'shopt -s nullglob; shopt -s dotglob; files=("$1"/*); [[ ${files[@]} ]] || rmdir -v "$1"' -- {} \; 

Hier ist ein reines Bash-Beispiel (Version 4 oder höher):

shopt -s globstar
for dir in **/; do
   files=("$dir"/*)
   [[ ${files[@]} ]] || rmdir -v "$dir"
done
15
jordanm