Ruby: Wie kann ich leere Verzeichnisse rekursiv finden und entfernen?

8

Ich versuche, Ruby zu schreiben, der ein bestimmtes Verzeichnis rekursiv nach allen leeren untergeordneten Verzeichnissen durchsuchen und entfernen würde.

Gedanken?

Hinweis: Ich hätte gerne eine Skriptversion, wenn möglich. Dies ist sowohl ein praktisches Bedürfnis als auch etwas, das mir beim Lernen hilft.

    
Dane O'Connor 17.08.2009, 21:49
quelle

8 Antworten

15

In Ruby:

%Vor%     
kch 17.08.2009, 22:00
quelle
6

Betrachten Sie die Beispiele von kch, dB. und Vishnu oben habe ich einen One-Liner zusammengestellt, den ich für eine elegantere Lösung halte:

%Vor%

Ich verwende '**/' anstelle von '/**/*' für den glob, der nur Verzeichnisse zurückgibt, so dass ich später nicht testen muss, ob es ein Verzeichnis ist. Ich benutze reverse_each anstelle von sort.reverse.each , da es kürzer und angeblich effizienter ist, nach diesem posten . Ich bevorzuge Dir.entries(d).size == 2 bis (Dir.entries(d) - %w[ . .. ]).empty? , weil es ein wenig einfacher zu lesen und zu verstehen ist, obwohl (Dir.entries(d) - %w[ . .. ]).empty? wahrscheinlich besser funktionieren würde, wenn Sie Ihr Skript unter Windows ausführen müssten.

Ich habe das unter Mac OS X ziemlich oft getestet und es funktioniert auch mit rekursiven leeren Verzeichnissen.

    
Adam 04.04.2014 05:17
quelle
3

Sie müssen in umgekehrter Reihenfolge löschen, sonst, wenn Sie ein leeres Verzeichnis foo mit einer Unterverzeichnisleiste haben, werden Sie bar löschen, aber nicht foo.

%Vor%     
dB. 05.04.2011 20:17
quelle
2

Warum nicht einfach Shell?

  

finden. -type d-empty -exec rmdir '{}' \;

Genau das, was Sie wollen.

    
koenigdmj 17.08.2009 21:54
quelle
2
%Vor%

wie im ersten Beispiel, aber das erste Beispiel scheint das rekursive Bit nicht zu behandeln. Die Sortierung und Umkehrung stellt sicher, dass wir zuerst mit den verschachtelten Verzeichnissen umgehen.

Ich nehme an, sort.reverse könnte als sort {|a,b| b <=> a} für Effizienz

geschrieben werden     
Vishnu 28.02.2011 07:41
quelle
1
%Vor%     
Alex Fortuna 16.01.2010 20:12
quelle
0

Ich habe dieses Skript unter OS X getestet, aber unter Windows müssen Sie Änderungen vornehmen.

Sie können die Dateien in einem Verzeichnis, einschließlich versteckter Dateien, mit Dir # -Einträgen finden.

Dieser Code löscht Verzeichnisse, die nach dem Löschen von Unterverzeichnissen leer werden.

%Vor%     
alltom 17.08.2009 22:33
quelle
0
%Vor%     
xyz 17.08.2009 22:13
quelle

Tags und Links