2016-08-09 9 views
2

Ich habe ein Verzeichnis, das eine große Anzahl von Unterverzeichnissen enthält. Jedes Unterverzeichnis wird wie "treedir_xxx" benannt, wobei xxx eine Zahl ist. Ich möchte einen Befehl ausführen (vorzugsweise von der Befehlszeile, da ich keine Erfahrung mit Batch-Skripten habe), die die Anzahl der Dateien in jedem Unterverzeichnis namens "treedir_xxx" zählt und diese Zahlen in eine Textdatei schreibt. Ich denke, das sollte nicht sehr schwierig sein, aber bisher war ich erfolglos.Anzahl der Dateien in mehreren Unterverzeichnissen von der Befehlszeile aus gezählt

Ich habe Dinge wie find *treedir* -maxdepth 1 -type f | wc -l versucht, aber dies gibt nur die Gesamtzahl der Dateien und nicht die Anzahl der Dateien in jedem einzelnen Ordner zurück.

+0

tun Verzeichnisse nur Dateien enthalten oder auch als auch Verzeichnisse? Das heißt, wie tief ist der Baum von dirs? – fedorqui

+0

das könnte helfen; http://stackoverflow.com/questions/15216370/how-to-count-number-of-files-in-each-directory –

+0

Oder noch besser: http://stackoverflow.com/q/307015/2988730 –

Antwort

1

Verwenden Sie anstelle von find eine for-Schleife. Ich gehe davon aus, dass Sie bash oder ähnliches verwenden, da dies die häufigste Shell auf den meisten modernen Linux-Distributionen ist:

for i in treedir_*; do ls "$i" | wc -l; done 

die folgende Struktur gegeben:

treedir_001 
|__ a 
|__ b 
|__ c 
treedir_002 
|__ d 
|__ e 
treedir_003 
|__ f 

Das Ergebnis ist:

3 
2 
1 

können Sie erhalten Phantasie und drucken, was Sie rund um die Zahlen wollen:

for i in treedir_*; do echo $i: $(ls "$i" | wc -l); done 

gibt

treedir_001: 3 
treedir_002: 2 
treedir_003: 1 

Diese $(...) verwendet die Ausgabe eines Befehls als String zu erhalten und übergeben es an echo, die dann alles auf eine Zeile drucken.

for i in treedir_*; do echo $i; ls "$i" | wc -l; done 

gibt

treedir_001 
3 
treedir_002 
2 
treedir_003 
1 

Dies man die Verwendung von mehreren Befehlen in einer einzelnen Schleife veranschaulicht.

for kann in eine Datei oder verrohrt wie jeder anderer Befehl umgeleitet werden, so dass Sie auf das Programm

for i in treedir_*; do ls "$i" | wc -l; done > list.txt 

oder besser noch

for i in treedir_*; do ls "$i" | wc -l; done | tee list.txt 

Die zweite Version sendet die Ausgabe tun tee , die es auf Standardausgabe druckt und es auch in eine Datei umleitet. Dies ist manchmal besser zum Debuggen als eine einfache Umleitung mit >.

find ist ein leistungsstarker Hammer, aber nicht alles ist ein Nagel ...

+0

Ausgezeichnet danke, ich habe eine '> fnum.txt' in eine Textdatei geschrieben, aber das funktioniert hervorragend. – Jack

+0

@Jack. Das habe ich in meinem letzten Update angesprochen –

Verwandte Themen